Правильный способ реализации ThreadPool.RegisterWaitForSingleObject

Я пытаюсь использовать 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);

    }

}

Шпионский снимок экрана

alt text

7
задан dss539 13 November 2013 в 16:20
поделиться