gpt4 book ai didi

multithreading - 是否调用方法和函数

转载 作者:行者123 更新时间:2023-12-03 15:01:56 26 4
gpt4 key购买 nike

我有一个关于从不同线程调用方法的问题。我正在使用 WinUSB 驱动程序与 USB 设备进行通信。我有单独的线程从设备读取数据。对设备的命令在主线程中设置。实际上我正在使用 WinUSB_WritePipe 和 WinUSB_ReadPipe 方法来执行此类操作。在读取数据的线程中,我使用异步方法读取重叠结构和 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;

新方法:

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;

这是非常简化的代码,其意图仅用于描述我的问题,并不反射(reflect)我的编程技能。 :) 当然,使用相同的互斥体,我锁定然后在主线程中调用相同的方法。

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

感谢您提前抽出时间并给予答复。我真的很感激!

Br,尼克斯

最佳答案

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

关于multithreading - 是否调用方法和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10521309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com