Запуск метода в другом потоке C ++ - PullRequest
1 голос
/ 17 октября 2011

У меня проблемы с поиском способа запуска метода в отдельном потоке в C ++ (с использованием Visual C ++ 2008), я пробовал несколько способов сделать это, но ни один из них до сих пор не был успешным.

Я очень новичок в C ++, но довольно опытный программист на Java, но мне было дано задание исправить некоторые ошибки в старом приложении C ++. Программа использует объект под названием «Mpeg» для управления пакетированием и депакетизацией файла Mpeg. После правильной настройки объекта Mpeg необходимо вызвать mpeg.Depacketise, который затем запускает метод DepacketiseInputFile ().

Я пытался заставить DepacketiseInputFile () работать в отдельном потоке, используя _beginthread и объект System :: Threading :: Thread, используя

Thread^ th = gcnew Thread(gcnew ThreadStart(DepacketiseInputFile));

однако это возвращает ошибки

с использованием & Mpeg :: Depacketise выдает ошибку

при использовании _beginthread код, который я пробовал, был

Однако, с этим у меня постоянно возникали проблемы с получением правильных аргументов, с ошибками вроде

всплывает.

Есть ли какой-нибудь простой способ сделать это, что любой может порекомендовать? Я провел несколько дней, играя с этим, но, похоже, ничего не получилось: (

Любая помощь будет принята с благодарностью.

Приветствие.

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Какой тип Mpeg? Какой метод является DepacketiseInputFile?

Если это обычный неуправляемый класс C ++, используйте _beginthread, но вы должны сделать DepacketiseInputFile статическим. Он не может принимать функцию-член.

Кроме того, не вызывайте DepacketiseInputFile с помощью DepacketiseInputFile (), передавайте его с помощью

  &Mpeg::DepacketiseInputFile

Вы должны использовать void *, который вы получите, чтобы передать его, чтобы передать указатель на объект Mpeg (и затем привести его обратно).

Если вы хотите использовать ThreadStart, тогда Mpeg должен быть управляемым классом.

РЕДАКТИРОВАТЬ: Если вы хотите сделать DepacketiseInputFile, но ему нужен доступ к объекту, то вы используете аргумент void * для передачи указателя.

Так что в .h:

 void DepacketiseInputFileMember();
 static void DepacketiseInputFile(void *thisObj);

Ваш код идет в DepacketiseInputFileMember () и записывает DepacketiseInputFile следующим образом:

 void Mpeg::DepacketiseInputFile(void *thisObj)
 {
     Mpeg* mpeg = reinterpret_cast<Mpeg*>(thisObj);
     mpeg->DepacketiseInputFileMember();
 }

Когда вы звоните _beginthread, используйте это

 _beginnthread(&Mpeg::DepacketiseInputFile, (unsigned)0, anMpegObjectPointer);

где anMpegObjectPointer - указатель на объект типа Mpeg. Вы должны убедиться, что время жизни объекта больше, чем было бы необходимо в потоке.

Простите мой синтаксис, я пишу это в текстовой области, а не в Visual Studio

1 голос
/ 17 октября 2011

Изменение

_beginthread(DepacketiseInputFile(), (unsigned)0, (void *)NULL);

до

_beginthread(DepacketiseInputFile, (unsigned)0, (void *)NULL);

Вы хотите передать адрес функции для запуска (DepacketiseInputFile), а не ее возвращаемое значение этой функции (то, что вы получаете от DepacketiseInputFile()).

Я предполагаю, что DepacketiseInputFile объявлен как void DepacketiseInputFile(void*) и не является нестатической функцией-членом некоторого класса. В противном случае типы не будут совпадать, даже если вы удалите скобки.

...