win32 CreateThread, как вызвать параметр lpStartAddress как функцию класса c ++? - PullRequest
2 голосов
/ 07 мая 2011

Я читал ветку о моей проблеме здесь:

как использовать CreateThread для функций, которые являются членами класса

после использования кода с сайта Microsoftздесь:
Как порождать консольные процессы с помощью перенаправленных стандартных дескрипторов
Я реализовал это решение, но есть некоторые проблемы, такие как:

Мне нужно использовать параметр lpvThreadParam в

DWORD WINAPI GetAndSendInputThread(LPVOID lpvThreadParam) 

как я могу реализовать это в предложенном RichieHindle примере?в функции ThreadStart?
также параметры в bRunThread и hStdIn (из примера Microsoft я инициирую их в конструкторе со значением, но когда я выполняю ThreadStart с содержимым GetAndSendInputThread из примера Microsoft, он показывает, что значенияникогда не устанавливаются.
Надеюсь, я был ясен, в основном я хотел бы иметь возможность запускать этот пример как класс c ++.

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Хорошо.Я думаю, что знаю, куда ты сейчас направляешься.Как насчет этого?Создайте канал в конструкторе класса и затем используйте дескриптор hInputWrite в функции потока класса (вызывается из функции статического потока.

class MyClass
{
    HANDLE hInputWrite;
    HANDLE hInputRead;
    SECURITY_ATTRIBUTES sa;

    MyClass() {
       if (!CreatePipe(&hOutputReadTmp,&hOutputWrite,&sa,0))
          DisplayError("CreatePipe");
    }

    static DWORD WINAPI StaticThreadStart(void* Param)
    {
        MyClass* This = (MyClass*) Param;
        return This->ThreadStart();
    }

    DWORD ThreadStart(void)
    {
        // Do stuff with hInputWrite handle here
    }

    void startMyThread()
    {
       DWORD ThreadID;
       CreateThread(NULL, 0, StaticThreadStart, (void*) this, 0, &ThreadID);
    }
};

MyClass thread;
thread.startMyThread();

(изменено из RichieHindles answer )

1 голос
/ 07 мая 2011

Просто измените StaticThreadStart, чтобы передать полученный им указатель реальному методу.

NB.Если вы используете стандартную библиотеку C или C ++, вам действительно следует использовать beginthread или beginthreadex от расширений MS до среды выполнения C, это гарантирует, что библиотеки C / C ++ правильно инициализируются для новогонить.

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