主程序运行后,我点击一个按钮后执行一个线程或者定时启动一个线程,线程执行的时候整个界面都不能点了,为什么,谢谢!!
解决方案 »
- 占3个字节的16进制如何转换为汉字?
- 发一个在Delphi中使用的memcmp和C中使用的memcmp函数的参数和返回值是完全一样的。
- 老大们,char系统求解!!!!!!!!
- 在线等待,谢谢!
- 非高手勿进!此问题在大富翁中无人回答(在线等待)
- 这三个帖子是不是作弊?
- 采用vfw进行视频传输,换到学校的机子上时对方接收视频有延迟,而在家里就正常
- 如何将Delphi所有的子窗体打开后显示在同一个Tabsheet中???
- 为什么我不能在主窗口中加入图片.请大家帮.
- 各位高手我是刚学DELPHI的菜鸟,高分请教问题请过来看看......
- 提问:GDI+打开的图像怎么在timage里面显示
- 内存地址错误
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(ComplDRI);
Terminate;
end;
end;
var
i: Integer;
LineDev: TLineDevs;
ATimeFrom, ATimeTo: TDateTime;
TableNotExistsList: TStringList;
QueryHisRetValue: Integer;
begin
if FormatDateTime('yyyy-MM-dd', FStartTime) <> FormatDateTime('yyyy-MM-dd', Now) then
begin
Bs.QueryOldPlanRunTime(FormatDateTime('yyyy-MM-dd', FStartTime), FormatDateTime('yyyy-MM-dd', FStartTime));
end;
Bs.QueryLineDevs; Bs.QueryLogInOrOff(FormatDateTime('yyyy-MM-dd hh:mm:ss', FStartTime - 1), FormatDateTime('yyyy-MM-dd hh:mm:ss', FEndTime));
ATimeFrom := FStartTime;
ATimeTo := FEndTime;
DevIDList := TStringList.Create;
DevIDList.Sorted := True;
TableNotExistsList := TStringList.Create;
TableNotExistsList.Sorted := True; for i := 0 to LineDevsManage.Count - 1 do
begin
FXMGpsDataList.Clear;
LineDev := LineDevsManage.Items[i];
if TableNotExistsList.IndexOf(LineDev.DevID) = -1 then
begin
if DevIDList.IndexOf(LineDev.DevID) = -1 then
begin
if Bs.IsTableExists('GPSDATA' + Trim(LineDev.DevID)) > 0 then
begin
QueryHisDatas(LineDev.LineID, LineDev.DevID, ATimeFrom, ATimeTo);
end
else
begin
TableNotExistsList.Add(LineDev.DevID);
end;
end;
end;
end;
TableNotExistsList.Free;
DevIDList.Free;
Frm_BusScheduing.tmr2.Enabled := True;
Frm_BusScheduing.btnComplDRI.Enabled := True;
end;
也就是说得把Synchronize给去了就可以了,试试。。
另外出错把错误信息贴出来,利于找到问题根源,还有你线程的函数怎么procedure TComplDriverRunInfo.ComplDRI;
var
i: Integer;
LineDev: TLineDevs;
ATimeFrom, ATimeTo: TDateTime;
TableNotExistsList: TStringList;
QueryHisRetValue: Integer;
begin
if FormatDateTime('yyyy-MM-dd', FStartTime) <> FormatDateTime('yyyy-MM-dd', Now) then
begin
Bs.QueryOldPlanRunTime(FormatDateTime('yyyy-MM-dd', FStartTime), FormatDateTime('yyyy-MM-dd', FStartTime));
end;
Bs.QueryLineDevs; Bs.QueryLogInOrOff(FormatDateTime('yyyy-MM-dd hh:mm:ss', FStartTime - 1), FormatDateTime('yyyy-MM-dd hh:mm:ss', FEndTime));
ATimeFrom := FStartTime;
ATimeTo := FEndTime;
DevIDList := TStringList.Create;
DevIDList.Sorted := True;
TableNotExistsList := TStringList.Create;
TableNotExistsList.Sorted := True; for i := 0 to LineDevsManage.Count - 1 do
begin
FXMGpsDataList.Clear;
LineDev := LineDevsManage.Items[i];
if TableNotExistsList.IndexOf(LineDev.DevID) = -1 then
begin
if DevIDList.IndexOf(LineDev.DevID) = -1 then
begin
if Bs.IsTableExists('GPSDATA' + Trim(LineDev.DevID)) > 0 then
begin
QueryHisDatas(LineDev.LineID, LineDev.DevID, ATimeFrom, ATimeTo);
end
else
begin
TableNotExistsList.Add(LineDev.DevID);
end;
end;
end;
end;
TableNotExistsList.Free;
DevIDList.Free;
Frm_BusScheduing.tmr2.Enabled := True;
Frm_BusScheduing.btnComplDRI.Enabled := True;
end;这两句,用一个函数来实现,并用Synchronize来执行。 Frm_BusScheduing.tmr2.Enabled := True;
Frm_BusScheduing.btnComplDRI.Enabled := True;Delphi里面的VCL是不支持多线程的。
begin
Application.ProcessMessages; FXMGpsDataList.Clear; //...
end;
循环里用Application.ProcessMessages可缓解界面消息阻塞.
这样用Synchronize就等于没用多线程。
var
StartTime, EndTime: TDateTime;
begin
btnComplDRI.Enabled := False;
try
FrmSelectHisTime := TFrmSelectHisTime.Create(Self);//这个是我用来选择时间段的窗体
try
FrmSelectHisTime.ShowModal;
if FrmSelectHisTime.ModalResult = mrOK then
begin
StartTime := FrmSelectHisTime.Start_Date.DateTime;
ReplaceTime(StartTime, FrmSelectHisTime.Start_Time.Time);
EndTime := FrmSelectHisTime.End_Date.DateTime;
ReplaceTime(EndTime, FrmSelectHisTime.End_Time.Time);
FComplDriverRunInfo := TComplDriverRunInfo.Create(False, StartTime, EndTime);//此处启动线程
end
else
btnComplDRI.Enabled := True;
except
btnComplDRI.Enabled := True;
end;
finally
FrmSelectHisTime.Free;
end;
end;
//变量都定到TComplDriverRunInfo类中
begin
Synchronize(aaa);
for i := 0 to LineDevsManage.Count - 1 do
begin
Synchronize(bbb);
end;
Synchronize(ccc);
end;
procedure TComplDriverRunInfo.aaa;
begin
if FormatDateTime('yyyy-MM-dd', FStartTime) <> FormatDateTime('yyyy-MM-dd', Now) then
begin
Bs.QueryOldPlanRunTime(FormatDateTime('yyyy-MM-dd', FStartTime), FormatDateTime('yyyy-MM-dd', FStartTime));
end;
Bs.QueryLineDevs; Bs.QueryLogInOrOff(FormatDateTime('yyyy-MM-dd hh:mm:ss', FStartTime - 1), FormatDateTime('yyyy-MM-dd hh:mm:ss', FEndTime));
ATimeFrom := FStartTime;
ATimeTo := FEndTime;
DevIDList := TStringList.Create;
DevIDList.Sorted := True;
TableNotExistsList := TStringList.Create;
TableNotExistsList.Sorted := True;
end;
procedure TComplDriverRunInfo.bbb;
begin
FXMGpsDataList.Clear;
LineDev := LineDevsManage.Items[i];
if TableNotExistsList.IndexOf(LineDev.DevID) = -1 then
begin
if DevIDList.IndexOf(LineDev.DevID) = -1 then
begin
if Bs.IsTableExists('GPSDATA' + Trim(LineDev.DevID)) > 0 then
begin
QueryHisDatas(LineDev.LineID, LineDev.DevID, ATimeFrom, ATimeTo);
end
else
begin
TableNotExistsList.Add(LineDev.DevID);
end;
end;
end;
end;
procedure TComplDriverRunInfo.ccc;
begin
TableNotExistsList.Free;
DevIDList.Free;
Frm_BusScheduing.tmr2.Enabled := True;
Frm_BusScheduing.btnComplDRI.Enabled := True;
end;