呵呵,你学过操作系统就知道,这是典型的生产者消费者问题,在线程中要用信号量来解决,或者用临界区吧,EnterCriticalSection,LeaveCriticalSection。

解决方案 »

  1.   

    我知道用EnterCriticalSection,LeaveCriticalSection。,在哪里写?
      

  2.   

    操作公共数据的之前用EnterCriticalSection,操作完毕用LeaveCriticalSection。记住,一定要LeavCriticalSection,而且要成对,否则,你的线程会越来越多:)
      

  3.   

    如果就是你说的情况的话,我认为e没有必要用线程写成函数就好了e()在每个线程这样调用Synchronize(e)你应该知道吧?
      

  4.   

    在线程中通讯,可以使用消息,PostMessage,没错只能用在窗口,但还有一个PostThreadMessage,就可以给线程发送消息,这洋a,b,c,d中发送消息给e,然后e做处理。e中自然就要有消息循环了。可以使用GetMessage()来得到消息。其他的,我想你应该会处理了吧。
      

  5.   

    sql服务器本身有自己的处理机制,多个线程,就象多个用户同时操作一张表,应该没问题的啊.
      

  6.   

    Assignfile(F,FileName);
    Reset(F); 
    while not Eof(f) do
          begin
            Readln(F,FileItem);
            AnalyzeDir(FileItem);
            with ADOCommand do
              begin
                 CommandText:='insert into allml(name,time,ip)'
                              +'values (:name,:time,:ip)';
                 Parameters.ParamByName('name').Value :=name;
                 Parameters.ParamByName('time').Value :=time;
                 Parameters.ParamByName('ip').Value :=ip;
                 execute//每增加一条记录,都execute一次,请问有没有批处理的方法,我用的是ADO控件。
             end;
           end;
         end
      

  7.   

    Assignfile(F,FileName);
    Reset(F); 
    while not Eof(f) do
          begin
            Readln(F,FileItem);
            AnalyzeDir(FileItem);
            with ADOCommand do
              begin
                 CommandText:='insert into allml(name,time,ip)'
                              +'values (:name,:time,:ip)';
                 Parameters.ParamByName('name').Value :=name;
                 Parameters.ParamByName('time').Value :=time;
                 Parameters.ParamByName('ip').Value :=ip;
                 execute//每增加一条记录,都execute一次,请问有没有批处理的方法,我用的是ADO控件。
             end;
           end;
         end
    我刚刚试了用多线程直接添加到数据库,有数据丢失,
    所以在execute后,我加了sleep(50);
    就可以,不过效率应该降了很多。
      

  8.   

    我现在也在做多线程的程序,我想,你的问题可以这样做:a,b,c,d四个线程每个线程有一个事件:ea,eb,ec,ed.初始化时都处于无信号状态,当a,b,c,d四个线程中有一个线程完成自己的工作,生成txt文件后,置相应的事件为有信号状态。e线程使用WaitForMultipleObjects等待这4个事件,有一个事件发生,就去做相应的处理工作,做完后继续阻塞等待事件发生。
      不过,我认为你最好用队列来实现它,具体的做法是:维护一个队列和一个信号量。A,B,C,D线程每生成一个文件,就加到队列里去,同时信号量加一。E线程阻塞等待信号量,有信号量时,信号量先减一,取队列数据,然后处理相应的工作。做完后继续阻塞等待信号量的发生。