在PC上连接了数目未定的U盘(假定),现在能够用程序读取出来这些状态(有几个就会能显示出几个,<=20个),目的在于给这些设备传输数据。问题在于:
1,我通过D中的Thread Object 来创建20个线程,我希望能够当检测到有几个设备的时候才会运行几个线程,这问题就在于我怎么去把一个线程与一个设备联系起来,一一对应的(因为不仅有传输还有回应)。
2,我传输的是TXT文本里的数据(200行,每一行需要一个反馈给主线程),我不知道用这样的线程Thread Object 会不会造成资源冲突,如果有冲突的话,该怎么去解决。我的想法是建立一个临界区,当一个线程读取到第一行的时候,封锁,然后释放,给第二个到达的线程,这样实施起来就会时间上有很大的增加,而且没有过这样的经验。国庆了,因为这个项目估计还得加班,希望有好心人能帮我解决下,或者给我点思路也好。

解决方案 »

  1.   

    1.配对.主线程里你负责检查U盘连接状态和工作线程的分派,用一个MAP来管理,把U盘的硬件序列号读出来(这个网上能找到源码),有一个U盘就创建一个对应的线程在这个U盘上工作(线程和U盘的关联当然应该是这个U盘的路径,因为你要去读写数据嘛),并把U盘序列号和线程ID绑定配对,存到MAP里,主线程不断扫描U盘状态,通过查MAP能知道哪些U盘是已经分派了线程的,就不用再创建了,而对于新连接上的还没有分派线程的U盘就新建线程,并配对再存入MAP,如此如此,这主动扫描的方法,另外,如果你能及时捕捉到U盘的"连接"和"断开"事件,那就在这两个事件上分别做线程的创建和销毁,这样更高效.2.你的做法是对的,多线程同时访问同一个文件,肯定要保护!花一点点等待时间换来安全是完全值得的.你可以把文件做内存映射,完全在内存中读写,效果会高些.
      

  2.   

    凑个热闹
    1.将usb的盘符与线程ID按顺序配对.
    2.对应后,线程同时读取是往各自的U盘里写东西,是不会冲突的.
      

  3.   

    那就不知道有两种创建线程的问题。用D中的TThread类 这个我稍微熟悉点,但是好象是创建的线程数量是固定的,需要开启的线程数量是不定的,怎么解决这个问题,貌似对这个很不理解。  如果还是用到调用WINDOWS里的createthread()函数???这两者分不清楚。
      

  4.   

    动态创建,用什么都一样,以TThread为例.
    type
      TXXXThread = class(TThread)
      {实现线程的工作逻辑,一些动态关联的数据可通过参数设置进来.}
      {...}
      end;{...}var
      pthr: ^TXXXThread;
    begin
      New(pthr); {动态创建}
      {...}
      Dispose(pthr); {最后请在适当(用完后)的地方销毁它.}
    end;
      

  5.   

    首先没有必要创建那么多的线程,并不是线程越多速度越快.同时读取应该不会有问题,可以先将文本文件都读到一个TStringList 中,所有线程都从这里取数据.为每个USB设备保存当前的状态,如USB设置的ID号,当前写入了第多少行ROW工作线程读取USB设备状态列表,检查看是否写完成了,如果没有则从ROW开始写入.如果所有的设置的写入行和TStringList 的行数相同了,则工作线程结束.
      

  6.   

    O_O _の囧の_O_O国庆快乐!!!