以下的代码,也知没有同步肯定错误,但不知如何同步,网上资料看了看,因为是第一次接触线程,没有真正适合或看的懂的,有知道的大虾可否指点一二。
procedure SendThread.Execute;
var
SendMobile,SendSMS:string;
Fitem:Tlistitem;
begin
while not terminated do
begin
with datamodule1.ADOSendFcsM do
begin
close;
sql.Clear;
sql.Add('select * from sendFcsM');
open;
if recordcount>0 then
begin
while not eof do
begin
mainfrm.sendmessage:='';
mainfrm.SendPhoneStr:='';
mainfrm.sendmessage:=trim(fieldbyname('SendFcStr').AsString);
mainfrm.SendPhoneStr:=trim(fieldbyname('SendFcsMobile').AsString);
mainfrm.Sendsms; //发送短信
//显示在列表中
SendMobile:='';
SendSMS:='';
SendMobile:=trim(fieldbyname('SendFcsMobile').AsString);
SendSMS:=trim(fieldbyname('SendFcStr').AsString);
Fitem:=mainfrm.listview2.Items.Add;
if InforConFrm.StatusBar1.Panels.Items[1].Text='信息发送成功' then
begin
Fitem.ImageIndex:=2;
with datamodule1.ADOMessSend do //保存的到已发送列表中
begin
close;
sql.Clear;
sql.Add('select * from Messsend');
open;
append;
fieldbyname('Mobile').AsString:=SendMobile;
fieldbyname('SendMessage').AsString:=SendSMS;
fieldbyname('SendDate').AsString:=formatdatetime('yyyy-mm-dd hh:nn:ss',now);
fieldbyname('SendUser').AsString:='FCSSend';
post;
end;
delete; //保存后删除
ExecSQL
end else
begin
Fitem.ImageIndex:=0; //Fitem.ImageIndex:=2;是发送成功
next;
end;
Fitem.SubItems.Add(SendMobile);
Fitem.SubItems.Add(SendSMS);
Fitem.SubItems.Add(datetimetostr(now()));
end;
end;
end;
end;
end;
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
先要清楚,用线程是为了让 什么行为 能与 什么行为 “并发”进行
------解决方案--------------------------------------------------------
跟界面有关的用synchronize进行同步,其他的放到Execute里才能发挥线程的作用。
记住,用synchronize调用的部分是在主线程里执行的。
------解决方案--------------------------------------------------------
这么说吧,线程同步有临界区,互斥,信号量和synchronize几种方式,具体代码可以查看百度~万一的博客,里面有详细的例子,但是从LZ的代码来看,不知道LZ主要想实现什么样的同步效果呢?感觉与其花时间实现线程同步,不如研究下sql的事物处理来得直接,因为你的代码主要操作都是从数据库查询和添加来实现的。而且代码本身好像不需要多线程啊
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
把你的代码切成小段。
如果主线程没有用到数据库,数据库部分可以搁到Synchronize之外。
如果用到主界面,此部分应该同步。
------解决方案--------------------------------------------------------