全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1885
推到 Plurk!
推到 Facebook!

在DLL中是否可以使用多线程?

答題得分者是:malanlk
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-23 11:50:15 IP:60.212.xxx.xxx 未訂閱
请教:在DELPHI编写的DLL中是否可以使用多线程? 如果可以的话应该怎样做?需要注意些什么?
yhchu
一般會員


發表:2
回覆:70
積分:24
註冊:2004-01-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-23 13:16:38 IP:220.130.xxx.xxx 未訂閱
可以!跟直接寫在主程式裡並沒有什麼不同。
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-23 18:00:36 IP:60.212.xxx.xxx 未訂閱
谢谢!不过有一个问题 我把原来的那个多线程的.pas在建立DLL后添加到DLL工程里, 再在DLL里建了个procedure,直接用这个过程给那个多线程赋值, 但这样引用这个DLL后,线程查看器里可以看到线程,但线程不工作,好象是挂职起了,但在Form里直接使用这个多线程的.pas却一点问题都没有; 对了引用DLL后的那个FORM在要关闭时出现以下错误提示 检测到错误类EinvalidPointer,错误信息:'Invalid pointer operation' 请帮帮忙!
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-23 18:23:55 IP:60.212.xxx.xxx 未訂閱
DLL中的代码如下 library Project1; uses ShareMem, SysUtils, Classes, ThreadDown_Unit in 'ThreadDown_Unit.pas'; procedure HTTPDownStar; stdcall; begin try ManagerThread.BeginManager('http://210.51.190.26:8000/a.rmvb', '', '', 5, 128, 100, false); except end; end; {$R *.res} exports HTTPDownStar; begin end. 其中ManagerThread.BeginManager('http://210.51.190.26:8000/a.rmvb', '', '', 5, 128, 100, false); 为ThreadDown_Unit多线程的.pas里的一个过程 發表人 - lonmener 於 2005/09/23 18:24:36
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-23 18:47:24 IP:203.69.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=33254    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=78585    這兩篇看看, 應該有幫助    但線程不工作, 線程部分程式貼上來看看... 發表人 - malanlk 於 2005/09/23 18:52:35
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-23 19:32:47 IP:60.212.xxx.xxx 未訂閱
procedure THttpDownThread.Execute; var MS: TMemoryStream; //动态创建内存线程 FS: TFileStream; aStar, aEnd: integer; aMyidhttp: TIdHTTP; begin while ThreadStatus = true do //如果线程状态开启为开启 begin if (LogFileDown.LogReadTotalValue(bPatch,bFile) 2)=bSize then //如果已下载的字节等于文件大小则删除记录文件 begin ThreadStatus := false; Free; end; dIndex := LogFileDown.LogFindIndex(bPatch, bFile, 0); //查找记录文件中可用的行号 LogFileDown.LogWriteStatu(bPatch, bFile, dIndex, 1); if dIndex < 0 then Free; if dIndex = 0 then aStar := 1 else aStar := LogFileDown.LogReadValue(bPatch,bFile,(dIndex - 1)); aEnd := LogFileDown.LogReadValue(bPatch, bFile, dIndex); aMyidhttp := TIdHTTP.Create(nil); Myidhttp := aMyidhttp; aMyidhttp.OnWork := MyidhttpWork; aMyidhttp.OnWorkBegin := MyidhttpWorkBegin; aMyidhttp.OnWorkEnd := MyidhttpWorkEnd; aMyidhttp.Request.ContentRangeStart := aStar - 1; aMyidhttp.Request.ContentRangeEnd := aEnd; aMyidhttp.HandleRedirects := true; //允许地址转向 aMyidhttp.ReadTimeout := 45000; //设置超时时间 MS := TMemoryStream.Create; MS.Clear; try aMyidhttp.Get(aUrl, MS); //开始下载 except ManagerThread.DownSendMsg('下载过程中 失败 改写线程操作状态值成功!'); aMyidhttp.Free; Free; end; try while Fstatus = true do sleep(20); Fstatus := true; FS := TFileStream.Create((bPatch bFile), fmOpenWrite); FS.Position := aStar-1; //设置保存文件的启始位置 MS.SaveToStream(FS); //将MS拷贝到FS从而保存到aFILE中 except ManagerThread.DownSendMsg('保存到文件中 失败 改写线程操作状态值成功!'); FS.Free; MS.Free; Fstatus := false; aMyidhttp.Free; Free; end; FS.Free; MS.Free; Fstatus := false; aMyidhttp.Free; LogFileDown.LogWriteStatu(bPatch, bFile, dIndex, 2); end; end; 發表人 - lonmener 於 2005/09/23 23:16:16
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-23 19:38:13 IP:60.212.xxx.xxx 未訂閱
要不我上传您看看?
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-23 19:41:17 IP:60.212.xxx.xxx 未訂閱
原来的pas文件有点大,全贴上来太长 發表人 - lonmener 於 2005/09/23 23:13:19
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-24 01:51:55 IP:61.219.xxx.xxx 未訂閱
while Fstatus = true do sleep(20); 如果 FStatus=true 程式就會卡在這裡 Fstatus := true; 不然, 上傳我看看... 發表人 - malanlk 於 2005/09/24 01:57:38
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-24 09:37:56 IP:60.212.xxx.xxx 未訂閱
那个是一个开关,一般不会一直为true的, 發表人 - lonmener 於 2005/09/24 09:39:18 發表人 - lonmener 於 2005/09/24 13:35:32
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-24 11:28:53 IP:60.212.xxx.xxx 未訂閱
对了还有两个问题 一、如果要想让别的编程语言象VC或BCB或C 等编写的程序可以使用此DLL需要注意一点变量的设置,如string改成pchar或shortstring等 这个是不是指 dll对外接口上的那个过程或方法需要注意,而DLL里的不对外的其它的过程或方法或变量就没有限制? 二、DLL中的IDHTTP怎么样才可以让FORM得到他的下载量?也是通过Timer来周期性的检查一个integer变量?有没有别的方法? 因为我感觉这种用TIMER的方法是FORM主动式的,有时下载慢时会重复取得一个值;如果用IDHTTP的onwork来更新的话如果下载速度快的话,更新太快,CPU占用率又会高,有没有什么更好的办法? 發表人 - lonmener 於 2005/09/24 11:34:51
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-24 11:40:29 IP:61.219.xxx.xxx 未訂閱
有傳簡訊給你
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-24 11:54:35 IP:60.212.xxx.xxx 未訂閱
收到 我去下个MSN试试 下载速度挺慢的! 發表人 - lonmener 於 2005/09/24 12:09:34
系統時間:2024-05-11 0:24:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!