还是多线程的问题,不知道问题在哪里?请高手解决! ( 积分: 100 )

  • 主题发起人 主题发起人 hubo927
  • 开始时间 开始时间
H

hubo927

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是一个线程的execute,不知道为什么它只执行一次
procedure TAutoSendSMS.Execute;
begin
while not Terminated do
begin
GetReceiveData;
TestReceiveData;
//在这里获得测试数据,是在程序中写的
Synchronize(SendDate);//跟界面交互的都写在SendDate中了,就是把前面获得的数据往窗体的memo中写
Sleep(1000);
end;
end;
我要的得到的结果是:不停的从testreceivedata中获得数据,然后往界面上显示
可不知道为什么它就执行一次循环,就停了,请问什么原因?
 
下面是一个线程的execute,不知道为什么它只执行一次
procedure TAutoSendSMS.Execute;
begin
while not Terminated do
begin
GetReceiveData;
TestReceiveData;
//在这里获得测试数据,是在程序中写的
Synchronize(SendDate);//跟界面交互的都写在SendDate中了,就是把前面获得的数据往窗体的memo中写
Sleep(1000);
end;
end;
我要的得到的结果是:不停的从testreceivedata中获得数据,然后往界面上显示
可不知道为什么它就执行一次循环,就停了,请问什么原因?
 
while truedo
begin
.
if terminated then
break;
.
.
end;
这样试试
 
TestReceiveData;
//在这里获得测试数据,是在程序中写的
Synchronize(SendDate);//跟界面交互的都写在SendDate中了,就是把前面获得的数据往窗体的memo中写
Sleep(1000);

这个地方修改下,SenData里面不要往界面上发东西了,Sleep也不要弄了,Sleep可能会占用CPU,而丢失数据
在SendData里面把收到的数据用OutputDebugString('asdfsadf');的方式
然后在delphi中View->Debug Windows->Event Log
这样你就可以看数据是不是接受正常,然后你再判断是不是你的同步出了问题,我们公司以前的老大都是用消息的方式,很少用同步,Delphi的大多数控件都是线程不安全的

个人看法,仅供参考
 
关键是停在那里,是在循环内停下来吗?还是跳出循环而停下来?必须搞清楚才好研究下一步的对策。
 
Sleep(1000);
不要
 
为什么不要Sleep(1000),它只提供一个执行间隔,并且可以释放时间给主程序,其它没有什么影响的。
关键是下面的语句,是否有问题,假如有的话,若放在主程序执行会出错,放在线程执行则停下来
GetReceiveData;
TestReceiveData;
 
我也认为是线程同步的问题,我也遇到过类似问题,如果去掉线程同步,线程可以正常执行,否则就和楼主一样执行一次就不执行了,不过当时是在dll里面开线程,因为dll本身也是一个单独的线程,我想和主线程根本同步不了,反正郁闷。现在不用delphi封装的线程类了,直接调用winapi函数createthread函数搞定,看过一些关于创建线程方法比较的讨论,都认为最好用delphi的封装的线程类,我觉得无所谓,只要能解决问题就行,现在我的程序也没什么不妥,线程运行很正常,反而觉得delphi 的哪个同步别扭,只能说我现在还用不上,楼主不妨调用api函数试试。
 
我将下面的语句放在Timer定时器中执行就没有问题
GetReceiveData;
TestReceiveData;
//在这里获得测试数据,是在程序中写的
SendDate;//跟界面交互的都写在SendDate中了,就是把前面获得的数据往窗体的memo中写
一放到线程里就停了
 
从已经贴出的代码看没什么问题,在Delphi 6里Synchronize是在主线程Idle状态下
执行的。
具体问题估计只能从你这个线程类的具体实现中找了。
 
同意xeen,估计是SendDate有问题了。
 
线程在Idle状态,很容易停下来。
 
while not Terminated do
begin
try
GetReceiveData;
TestReceiveData;
//在这里获得测试数据,是在程序中写的
Synchronize(SendDate);//跟界面交互的都写在SendDate中
except end;
Sleep(1000);
end;
 
光凭楼主所提供的一点代码是无法判断具体出错原因的,就如盲人摸象。
所以,迷糊兄也只好给你开了一服抗生素,管你什么病,包治标!呵呵
 
如果Excute中发生了异常又没有处理的话,线程就停止了。
 
后退
顶部