关于在dll内部建立线程,释放线程的问题? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061128091220158.html
请问能否在dll内部函数里建立线程,执行完线程后再释放线程,然后函数返回相应值?在这种情况应该如何建立、执行和释放线程?
我的部份代码如下:
问题1:执行时主窗口会无法操作(按理线程就是可以避免此类现象的),cpu100%,
2:释放时出错;
主窗口:
procedure TForm1.Button1Click(Sender: TObject);
var
Return:Integer;
begin
Return:= ReadData();//调用dll的读函数
...//根据返回值来处理
end;
动态库dll:
var
ReadDataThread:TReadDataThread;//线程声明
ReadData():Integer;stdcall;
begin
ReadThread:= TReadDataThread.Create(False);//建立线程马上执行
ReadThread.WaitFor;//等待执行完毕;
ReadThread.Free;//释放
end;
线程单元:
type
TReadDataThread = class(Thread)
procedure Read;
private
protected
procedure Execute;override;
end;
var
time:Integer;
implementation
{ TReadDataThread }
procedure TReadDataThread.Read;
begin
time:= 0;
while Ture do
begin
if 9999 < time then exit;//到9999则退出
Inc(time);//递增1
end;
end;
procedure TReadDataThread.Execute;
begin
{ Place thread code here }
Synchronize(A);
end;
end.
procedure TReadDataThread.Execute;
begin
{ Place thread code here }
Synchronize(A);
end;
-------->看看你执行了什么?线程的执行体就是把事件抛给主线程来处理?!
你重新编写线程类代码,这里写的有点乱乱的.
TThread类线程释放的时候调用Terminate过程结束线程。Terminate过程只是简单地设
置线程类的Terminated标志,让Execute方法执行完毕,然后Destroy。
Synchronize(A);
不会执行到dll里面的A过程,因为Synchronize是给主线程来处理,也就是dll的属主程序。
谢谢xjjrocker(了无痕)和Dlwxn(Dlwxn)
我想问一下,那能否在dll函数里创建线程,再由dll函数释放呢?应该怎么写呢?谢谢各位了。
如果不考虑与主进程同步Synchronize。
dll里面的线程和主程序里面的线程一样的写法。
在线程的执行或者创建时候,FreeOnTerminate := True;,这样当线程终止时候,线程事例就会自动销毁。
如果手动干预线程终止,就不能 FreeOnTerminate := True.
这些前提是dll静态调用,或者dll动态调用不马上是否dll句柄。否则线程没有执行完毕,dll就被你释放了。
这些前提是dll静态调用,或者dll动态调用不马上释放dll句柄。否则线程没有执行完毕,dll就被你释放了。
我的想法应该这样啊:
主程序调用dll的Read函数,进入Read函数,在Read函数里建立线程,这个线程是用来读数据的,是用条件循环的方式,条件成立就退出循环,释放线程,再返回到Read函数里建立线程的下一条语句继续执行,通过线程里读到的数据进行下一步的处理。直到Read函数退出。那我的调用dll函数的主程序再通过Read函数的返回值作处理。
这样主程序在调用Read函数时,就不至于由于Read里的循环而导致主调无法移动等窗口操作
就这样一个过程。
希望各位大侠帮忙!!!谢谢
再返回到Read函数里建立线程的下一条语句继续执行
---------------------你这是同步吧。要线程有什么用?
DLL中函数A创建线程,传入系统主窗体的HANDLE,执行操作,完成后给主窗体发送消息B
主程序调用A。
主程序处理消息B
用线程就是异步的。