以下的代码,也知没有同步肯定错误,但不知如何同步,网上资料看了看,因为是第一次接触线程,没有真正适合或看的懂的,有知道的大虾可否指点一二。
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;
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;
解决方案 »
- 通过adotable的loadfromfile从xml文件读取数据,如何可以比较高效的把数据保存入数据库
- [向supertitan001提问] ~给泰坦哥散分~泰坦哥系好淫~
- 文件夹过滤
- 怎么判断 汉字 中的 数字及标点符号?
- 组播也是广播? 使用SetSockOpt接口实现的组播好象也是广播!
- 在DBGRID中如何使行处于选中状态
- 如何使用InstallShield 在安装时将信息写入注册表?
- 急!如何在代码中设置QuickRep(报表)的纸张类型!解决了一定重谢!
- 恼人的问题, 请教高人.
- Delphi5+MsSqlServer的连接问题
- 高手们看看,如何取得进程内当前栈总使用大小,如何取得线程内栈使用大小
- 哪位大侠能否写个 uThreadPool线程池应用的Demo。
调用时将该过程加synchronize进行同步
synchronize(过程)
procedure SendThread.SendPro;
var
SendMobile,SendSMS:string;
Fitem:Tlistitem;
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;
procedure SendThread.Execute;
begin
while not terminated do
begin
synchronize(SendPro);
end;
end;
记住,用synchronize调用的部分是在主线程里执行的。
全部使用Synchronize加载到主线程中,那和直接在主线程中写代码有区别嘛?粗看代码后,感觉楼主这里发送短信和保存数据库应该使用同步!其它的地方如果不涉及到共用的话,就不需要了!自己根据实际情况而看下哪里需要同步吧!
如果主线程没有用到数据库,数据库部分可以搁到Synchronize之外。
如果用到主界面,此部分应该同步。
声明:
var CS: TRTLCriticalSection;
初始化,可在窗体Show时初始化
InitializeCriticalSection(CS); {初始化}线程中
EnterCriticalSection(CS); //进行临界区
...
...
synchronize(过程);
...
...
LeaveCriticalSection(CS); //离开临界区
以及临界值的作用