在DLL中是否可以使用多线程? |
答題得分者是:malanlk
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
yhchu
一般會員 發表:2 回覆:70 積分:24 註冊:2004-01-28 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
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 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
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 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
对了还有两个问题 一、如果要想让别的编程语言象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 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |