Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1266872
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-11-27 21:17:38



请问能否在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  
   
  用线程就是异步的。

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~