本人的一个监控软件中,有个多线程问题,请大家帮我解答一下:
button启动线程,
线程: procedure onlinethread.Execute;
var
aa:TOnLineClass;
bb:TcommClass;
FirstTickCount,Now:Longint;
a,b,c:longint;
i:integer;
kk:integer;
begin
aa.InitializationiSCOPE;//初始化图形控件
kk:=1;
while kk>0 do
begin
bb.AskStop;//设备读取数据请求指令
sleep(100);
bb.AskRequired;//问数据是否准备好
sleep(100);
bb.DataRec_Ready;//确认数据准备好
sleep(100);
bb.RecIa;//读通道1数据
sleep(200);
bb.Ia_data_Ready;//解析数据
bb.RecIb;//读通道2数据
sleep(200);
bb.Ib_data_Ready;//解析数据
bb.RecIc;//读通道3数据
sleep(200);
bb.Ic_data_Ready;//解析通道3数据
bb.RecUa;//读通道4数据
sleep(200);
bb.Ua_data_Ready;//解析通道4数据
bb.Recub;//读通道5数据
sleep(200);
bb.ub_data_Ready;//解析通道5数据
bb.Recuc;//读通道6数据
sleep(200);
bb.uc_data_Ready;//解析通道6数据
aa.Display_Online;//将全部解析数据显示
end;
end;在运行一段时间后,主界面不能显示,经调试发现在线程里面读通道数据,或者解析数据时死掉了,但是主界面能正常运行,请问是哪里出了问题?
分不够再加!
急!!!
button启动线程,
线程: procedure onlinethread.Execute;
var
aa:TOnLineClass;
bb:TcommClass;
FirstTickCount,Now:Longint;
a,b,c:longint;
i:integer;
kk:integer;
begin
aa.InitializationiSCOPE;//初始化图形控件
kk:=1;
while kk>0 do
begin
bb.AskStop;//设备读取数据请求指令
sleep(100);
bb.AskRequired;//问数据是否准备好
sleep(100);
bb.DataRec_Ready;//确认数据准备好
sleep(100);
bb.RecIa;//读通道1数据
sleep(200);
bb.Ia_data_Ready;//解析数据
bb.RecIb;//读通道2数据
sleep(200);
bb.Ib_data_Ready;//解析数据
bb.RecIc;//读通道3数据
sleep(200);
bb.Ic_data_Ready;//解析通道3数据
bb.RecUa;//读通道4数据
sleep(200);
bb.Ua_data_Ready;//解析通道4数据
bb.Recub;//读通道5数据
sleep(200);
bb.ub_data_Ready;//解析通道5数据
bb.Recuc;//读通道6数据
sleep(200);
bb.uc_data_Ready;//解析通道6数据
aa.Display_Online;//将全部解析数据显示
end;
end;在运行一段时间后,主界面不能显示,经调试发现在线程里面读通道数据,或者解析数据时死掉了,但是主界面能正常运行,请问是哪里出了问题?
分不够再加!
急!!!
睡前加一个这个:
Application.ProcessMessages;
bb:TcommClass;
的方法中有进行线程同步吗?Display_Online这个方法涉及到vcl要使用synchronize吧