调用方法和函数

Nix*_*Nix 6 delphi multithreading thread-safety delphi-2010 winusb

我有一个关于从不同线程调用方法的问题.好吧,我正在使用WinUSB驱动程序与USB设备进行通信.我有单独的线程来从设备读取数据.设备的命令在主线程中设置.实际上我正在使用WinUSB_WritePipe和WinUSB_ReadPipe方法来执行此类操作.在读取数据的线程中,我使用asynchronus方法读取重叠结构和WaitForMultipleObject.我的设备有一些我需要设置的功能,这是通过主线程中的GUI完成的.

我观察到一些奇怪的行为.我的问题是我是否需要将调用(例如,使用互斥锁)锁定到此方法,因此只有一个线程正在访问或调用方法.

老路:

type TMyThread = TThread
   protected
      procedure Execute; override;
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
  begin   
     WinUsb_ReadPipe(Pipe, Amount, Overlapped)
     ErrNo := GetLastError;                   
     if ErrNo = ERROR_IO_PENDING then 
     begin 
       wRes = WaitForMultipleObjects(2, @HndEvt, false);
       if wRes = WAIT_OBJECT_0 then
       begin 
         ResetEvent(Overlapped.hEvent);
         WinUSB_GetOVerlappedResult
         DoSomethingWithData; // Do something
       end;
     end;  
  end;
end;

MainThread:
begin
  // Set device sample rate
  WinUSB_WritePipe (Pipe, Amount, Data, ...)
end;
Run Code Online (Sandbox Code Playgroud)

新方法:

type TMyThread = TThread
   protected
      procedure Execute; override;

   public
     procedure Lock;
     procedure Unlock;

     constructor Create(ASuspended: boolean); override;
     destructor  Destroy; override;
end;

constructor TMyThread.Create(ASuspended: boolean); 
begin
  hMtx := CreateMutex(nil, false, nil);
end;

destructor  TMyThread.Destroy(ASuspended: boolean); 
begin
  CloseHandle(hMtx);
end;

procedure TMyThread.Lock; 
begin
  WaitForSingleObject(hMtx, 10000);
end;

procedure TMyThread.Unlock; 
begin
  ReleaseMutex(hMtx);
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
  begin   

     Lock;
     WinUsb_ReadPipe(Pipe, Amount, Overlapped)
     Unlock;

     ErrNo := GetLastError;                   
     if ErrNo = ERROR_IO_PENDING then 
     begin 
       wRes = WaitForMultipleObjects(2, @HndEvt, false);
       if wRes = WAIT_OBJECT_0 then
       begin 
         ResetEvent(Overlapped.hEvent);
         Lock;
         WinUSB_GetOVerlappedResult
         Unlock;

         DoSomethingWithData; // Do something
       end;
     end;  
  end;
end;

MainThread:
begin
  // Set device sample rate
  Lock; // same mutex as in TMYThread
  WinUSB_WritePipe (Pipe, Amount, Data, ...)
  Unlock; // same mutex as in TMYThread 
end;
Run Code Online (Sandbox Code Playgroud)

这是非常简化的代码,其内涵仅用于描述我的问题,并不反映我的编程技巧.:)当然使用相同的互斥锁我锁定然后在主线程中调用相同的方法.

我希望我尽可能简单地描述我的问题......所以再次:我是否需要在不同的线程中锁定对这些方法的调用?

感谢您提前的时间和答案.我真的很喜欢它!

Br,Nix

who*_*ddy 3

如果您下载并阅读winUSB白皮书,您会发现winUSB有一个很大的缺点:它不支持同一USB设备的多个并发应用程序。恕我直言,这意味着您不能同时进行读取调用。