求助——关于线程!

春风老少年 2012-04-10 07:08:30
事情是这样,有个用C写的DOS程序,现在需要改成WINDOWS界面的,方便操作。
我把DOS的程序弄成了一个DLL来给DELPHI写的界面调用,但是界面会假死。
DOS程序的结构大概是这样的:
1.供界面调用的借口函数,用来接收界面传递过来的参数(传址调用)
2.借口函数调用程序里的函数A,然后函数A里调用某些设备初始化、服务端启动的函数,同时,函数A调用函数B,函数B里有个while(1){....}的死循环,里面两个函数调用,用来计算传递过来的参数,和在CMD窗口里显示处理后的数据。这期间,借口函数接收的参数会传递到函数A,然后再传递到函数B,以供While(1)循环中的两个处理函数调用。

现在遇到的问题是这样:由于不熟悉DELPHI的线程,我在窗口Create过程里使用了Thread.Create(true)挂起线程,然后用一个checkbox来激活或再次挂起线程。
本来的想法是用timer来激活,checkbox勾选的时候timer的enable=true,然后线程resume,但是不行,界面是不会假死了,但是反应很慢,而且DLL处理后的数据完全没有响应到windows程序界面上。后来在checkbox里勾选的时候直接resume也一样不行,效果和用timer是一样的。所以很纳闷,求解!还有,我不知道在Thread.Excute里写了调用dll的代码,然后在timer的onTimer过程里需不需要再写上Thread.Excute?感觉好像是不需要,但是timer一遍遍的Resume,又感觉很别扭,是否第一次resume后如果没有suspend的话,再次resume线程delphi会自动忽略?
这两天仔细想了一下,用timer的话,由于会一遍遍的调用dll,所以设备初始化的函数也会一遍遍的被再次调用,这样不符合我的初衷。我想要的效果是,线程第一次调用了dll后,我再点击界面上的按钮时候只会自动调用while(1){...}中的数据处理部分,而不需要再次“被”初始化设备。
继续保留C程序中while(1){...}的话,delphi中线程部分该怎么写?
不用while(1){...}循环的话,while(1){...}部分该如何修改?因为如果程序正常运行的话,是需要while(1)中的函数来不停的处理、显示数据的,所以是个死循环。如果去掉while(1)的话,只能用timer(或线程吧?)不停的调用DLL来处理数据,但是感觉这样的处理方法很不妥当,不知道怎么破?

被这问题困扰两天了,实在不知道怎么弄了,求各位帮帮忙,谢谢!!!
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2012-04-11
  • 打赏
  • 举报
回复
我也关注并学习中..........
s11ss 2012-04-11
  • 打赏
  • 举报
回复
把while(1)放到线程里头!
JohnYale 2012-04-11
  • 打赏
  • 举报
回复
while(){}循环就一直傻呼呼的执行吗?有没有什么条件使它暂停等待一会 难道该循环一直有处理不完的数据?
或者在什么条件下循环退出?
可否将DLL中的函数改为两部分,一个初始化的,一个循环的,分别给界面调用?
一剑飘雪 2012-04-11
  • 打赏
  • 举报
回复
不要用timer 检测
用sendmessage 或者postmessage
春风老少年 2012-04-10
  • 打赏
  • 举报
回复
不管用的,我有加消息循环,没用。不过还是谢谢了。
s11ss 2012-04-10
  • 打赏
  • 举报
回复
错了,是GetMessage(&m, NULL, 0, 0);
反正就是说加上消息循环!!!
s11ss 2012-04-10
  • 打赏
  • 举报
回复
tagMsg m;
while(1)
{
if(!GetMessage(NULL, 0, 0, 0)) break;
TranslateMessage(&m);
DispatchMessage(&m);

...
}

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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