以下的代码,也知没有同步肯定错误,但不知如何同步,网上资料看了看,因为是第一次接触线程,没有真正适合或看的懂的,有知道的大虾可否指点一二。
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;

解决方案 »

  1.   

    把上面功能写成定义过程
    调用时将该过程加synchronize进行同步
    synchronize(过程)
      

  2.   

    是否写成这样就可以了,
    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;
      

  3.   

    只把设计VCL的用同步synchronize,越短越好
      

  4.   

    跟界面有关的用synchronize进行同步,其他的放到Execute里才能发挥线程的作用。
    记住,用synchronize调用的部分是在主线程里执行的。
      

  5.   

    这么说吧,线程同步有临界区,互斥,信号量和synchronize几种方式,具体代码可以查看百度~万一的博客,里面有详细的例子,但是从LZ的代码来看,不知道LZ主要想实现什么样的同步效果呢?感觉与其花时间实现线程同步,不如研究下sql的事物处理来得直接,因为你的代码主要操作都是从数据库查询和添加来实现的。而且代码本身好像不需要多线程啊
      

  6.   

    主要是想把数据的存取和处理,以及短信的发送都放到线程中,但不知那些需要同步,那些不需要,如LhyLhy的讲,现在这样编译和运行是没有问题了,但感觉不到线程另行处理的效果,相关的处理还是在主线程中,程序还是很卡
      

  7.   


    全部使用Synchronize加载到主线程中,那和直接在主线程中写代码有区别嘛?粗看代码后,感觉楼主这里发送短信和保存数据库应该使用同步!其它的地方如果不涉及到共用的话,就不需要了!自己根据实际情况而看下哪里需要同步吧!
      

  8.   

    可是这里所有除了保存和处理数据和发短信之外,都没有其它了,如果Synchronize的同步本来就是在主线中完成,那请有没有其它的办法的同步是在线程中来完成的,应当是怎样的写比较好,那位知者能否改一下代码,或提供一下源码样例
      

  9.   

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

  10.   

    临界区
    声明:
    var CS: TRTLCriticalSection;   
    初始化,可在窗体Show时初始化
    InitializeCriticalSection(CS); {初始化}线程中
    EnterCriticalSection(CS); //进行临界区
    ...
    ...
    synchronize(过程);
    ...
    ...
    LeaveCriticalSection(CS); //离开临界区
      

  11.   

    楼主先了解synchronize 的作用吧
    以及临界值的作用