求助——关于线程!
春风老少年 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来处理数据,但是感觉这样的处理方法很不妥当,不知道怎么破?
被这问题困扰两天了,实在不知道怎么弄了,求各位帮帮忙,谢谢!!!