Я пытаюсь использовать ThreadPool.RegisterWaitForSingleObject для добавления таймера к набору потоков. Я создаю 9 потоков и пытаюсь дать каждому из них равные шансы на работу, так как на данный момент, кажется, будет небольшой голод, если я просто добавлю их в пул потоков. Я также пытаюсь реализовать событие ручного сброса, так как я хочу, чтобы все 9 потоков завершились перед продолжением.
Каков наилучший способ гарантировать, что каждый поток в пуле потоков получит равные шансы на выполнение функции, которую я вызываю есть цикл, и кажется, что каждый поток (или тот, который запускается первым) застревает в нем, а остальные не получают возможности работать.
resetEvents = new ManualResetEvent[table_seats];
//Spawn 9 threads
for (int i = 0; i < table_seats; i++)
{
resetEvents[i] = new ManualResetEvent(false);
//AutoResetEvent ev = new AutoResetEvent(false);
RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, ObserveSeat, (object)i, 100, false);
}
//wait for threads to exit
WaitHandle.WaitAll(resetEvents);
Однако не имеет значения, использую ли я resetEvents [] или ev ни один из них не работает должным образом. Могу ли я реализовать это, или я (возможно) не понимаю, как они должны работать.
Спасибо, Р. Я могу получить дескриптор родительского окна, но когда я пытаюсь получить дескриптор кнопки, если всегда возвращает 0, я получил ...
У меня есть программа, которая должна отправить сообщение BM_CLICK кнопке другого приложения. Я могу получить дескриптор родительского окна, но когда я пытаюсь получить дескриптор кнопки, если всегда возвращает 0
, я получил название кнопки и тип кнопки из Spy ++, это кажется правильным, но я знаю, что, должно быть, что-то неправильно понял. ниже мой код
public const Int BM_CLICK = 0x00F5;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
private void button1_Click(object sender, EventArgs e)
{
Process[] processes = Process.GetProcessesByName("QSXer");
foreach (Process p in processes)
{
////the Button's Caption is "Send" and it is a "Button".
IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", "Send");
//ButtonHandle is always zero thats where I think the problem is
SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
}
Шпионский снимок экрана