当前位置: 代码迷 >> 多核软件开发 >> 关于线程同步的有关问题,
  详细解决方案

关于线程同步的有关问题,

热度:3036   发布时间:2013-02-26 00:00:00.0
关于线程同步的问题,急!!
以下的代码,也知没有同步肯定错误,但不知如何同步,网上资料看了看,因为是第一次接触线程,没有真正适合或看的懂的,有知道的大虾可否指点一二。
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.SendPro;
var
SendMobile,SendSMS:string;
Fitem:Tlistitem;
begin
with datamodule1.ADOSendFcsM do
begin
close;
sql.Clear;
sql.Add('select * from sen……

------解决方案--------------------------------------------------------
先要清楚,用线程是为了让 什么行为 能与 什么行为 “并发”进行
------解决方案--------------------------------------------------------
跟界面有关的用synchronize进行同步,其他的放到Execute里才能发挥线程的作用。
记住,用synchronize调用的部分是在主线程里执行的。
------解决方案--------------------------------------------------------
这么说吧,线程同步有临界区,互斥,信号量和synchronize几种方式,具体代码可以查看百度~万一的博客,里面有详细的例子,但是从LZ的代码来看,不知道LZ主要想实现什么样的同步效果呢?感觉与其花时间实现线程同步,不如研究下sql的事物处理来得直接,因为你的代码主要操作都是从数据库查询和添加来实现的。而且代码本身好像不需要多线程啊
------解决方案--------------------------------------------------------
探讨
把上面功能写成定义过程
调用时将该过程加synchronize进行同步
synchronize(过程)

------解决方案--------------------------------------------------------
把你的代码切成小段。
如果主线程没有用到数据库,数据库部分可以搁到Synchronize之外。
如果用到主界面,此部分应该同步。
------解决方案--------------------------------------------------------
  相关解决方案