关于创建线程在Dll里面无法执行Execute的问题

甜橙小C 2022-12-13 13:56:58

先贴代码

procedure TTCPV6Thread.Execute;
begin
  { Place thread code here }
  while (not Terminated) do
  begin
    try   //接收数据
      SetLength(tmpBuf, 0);
      fTCPClient.Socket.ReadBytes(tmpBuf, -1, false);
      nSize := Length(tmpBuf);
      if nSize > 0 then Synchronize(CreateDataReadEvent);
    except
    end;
  end;
end;

用的版本是delphi7

想创建一个线程来接收数据,但是总是收不到,下断点发现只有创建的时候生效过一次,后面再发数据断点就不生效了

然后在exe里面运行正常,每一次发送数据都会进入断点,想请教一下dll里面是不是要做一些设置?

...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

你的线程在DLL中,和主程序用的不是一套RTL和VCL,所以
Synchronize(CreateDataReadEvent);
这个有什么意义,你的设想是在exe的主线程中执行CreateDataReadEvent吗?

甜橙小C 2022-12-14
  • 举报
回复
@日立奔腾浪潮微软松下联想 是这样的,exe打开之后,会根据参数选择不同的dll来执行,然后我的CreateDataReadEvent里面有idtcpclient.socket.readbyte,如果不用Synchronize的话,程序就一直去读了,表现出来就是软件卡了失去响应
  • 举报
回复
@甜橙小C 这样的话,CreateDataReadEvent不会在exe的主线程中执行,只是在DLL的主线程中执行,D7中只能用包来替换DLL。如果用高版本的话(XE8+),可以用异步调用,先把exe的某个组件实例,比如主窗体Form1,传给DLL,之后就可以在DLL中用Form1.BeginInvoke异步调用在主线程中执行DLL中的代码(但是切记不要在这部分代码中使用全局变量,因为同一个全局变量在DLL和EXE中完全是两个变量)。
甜橙小C 2022-12-14
  • 举报
回复
@日立奔腾浪潮微软松下联想 嗯因为公司项目要和别人兼容,所以暂时只能用D7,我会按你说的去试试,感谢回复
2条回复
tanqth 2022-12-13
  • 打赏
  • 举报
回复

你的线程是为是自己停止了。

甜橙小C 2022-12-14
  • 举报
回复
@tanqth 应该没有,我的dll是生成一个form,我发现关闭这个form的时候弹出确认关闭的对话框的时候,线程里面的断点就生效了
tanqth 2022-12-14
  • 举报
回复
@甜橙小C 那可能与你这个窗体的关闭有关。而且,通常DLL里不要去做窗体。
甜橙小C 2022-12-14
  • 举报
回复
@tanqth 好的我再看看找找问题,感谢

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧