Использование функциональности Win32 API вместе с / от pthreads - PullRequest
1 голос
/ 03 июля 2011

У меня есть собственная библиотека потоков, созданная с использованием TinyThread ++. Это работает довольно хорошо, и это был также большой опыт обучения для меня. У меня есть свои собственные структуры данных для передачи сообщений, и интерфейс имеет для меня смысл, прежде всего потому, что я был его автором.

Всякий раз, когда в моей системе создается поток, он запускается в цикле и периодически проверяет наличие сообщений с помощью протокола передачи сообщений моего собственного устройства.

Теперь я хочу начать использовать некоторые функции Windows API, и в Windows есть собственный набор соглашений, очередей сообщений и т. Д. Теперь я почти уверен, что TinyThread ++ использует pthreads. Поскольку я использую MinGW, мне интересно, реализуется ли pthreads в потоках Windows. Если это так, я могу просто обработать свои потоки pthreads как потоки windows. Но если нет, я подозреваю, что могу столкнуться со странным поведением.

edit: глядя на тип thread, заданный Tinythread ++, похоже, что он на самом деле использует окна HANDLE для отслеживания потоков и даже использует _beginthreadex для их порождения.

У меня вопрос: будет ли Windows счастлива, если я продолжу вызывать SetWindowsHookEx с какого-то момента в моем коде pthreads? Я понимаю, что мне нужно иметь цикл опроса сообщений Windows в той же теме. Я намерен сделать что-то вроде этого:

try {

    HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc,
        NULL, 0);
    if (mousehook == NULL) printf("Mousehook error %u\n",GetLastError());

    while(true) {
        MSG msg;
        if (GetMessage(&msg,0,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    UnhookWindowsHookEx(mousehook);

    printf("Procedure completed without exceptional events.\n");

} catch (...) {
    printf("Exception!\n");
}

Ответы [ 2 ]

2 голосов
/ 03 июля 2011

Это должно быть хорошо.

Вы можете столкнуться с проблемами, если попытаетесь передать идентификаторы потоков pthread в функции потоков Windows, которым требуется HANDLE потока, но здесь вам просто нужно, чтобы цикл оставался в том же потоке, что и SetWindowsHookEx.

0 голосов
/ 03 июля 2011

Pthreads не существует в Windows, если вы не используете что-то вроде Cygwin. В любом случае, документы API говорят, что SetWindowsHookEx связывает хуки для событий приложения, привязанных к определенному потоку, ИЛИ к рабочему столу, на котором работает ваше приложение. Таким образом, он может обрабатывать вызовы в потоке, но вам нужно прочитать документы, чтобы вы вызывали их так, чтобы вы получали желаемую эффективность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...