Сбой WriteFile () при попытке продолжить многопоточность - PullRequest
1 голос
/ 23 сентября 2011

Я работаю над mfc dll, доступ к которому осуществляется через скрипт, и все это прекрасно работает.Я добавил к нему многопоточный компонент и пытаюсь использовать функцию WriteFile () для записи в мой последовательный порт, но каким-то образом функция WriteFile () выходит из приложения после выполнения 2-й команды записи.

Без бита многопоточности все работает нормально, и я могу применить столько команд writefile, сколько захочу.

Многопоточность: я использую

CreateThread(NULL,0,WorkerThread,this,0,0);

для создания своего потока.Использование «WorkerThread» для выполнения операций записи файла, описанных ранее в фоновом режиме.

Кроме того, мне нужно использовать функцию Sleep () во время записи через определенные мной интервалы.На данный момент программа просто закрывается при попытке использовать Sleep ().Итак, я только что удалил его, но понадобится на более позднем этапе.

Это известная проблема или что-то с очевидным решением?

Обновление: у меня есть сортировкапопытался приблизиться к проблеме, но так и не смог ее решить.По-видимому, похоже, что есть некоторые проблемы с моими параметрами WriteFile ().

WriteFile(theApp.m_hCom,tBuffer,sizeof(tBuffer),&iBytesWritten,NULL);

Он неправильно принимает sizeof (tBuffer) и из-за этого происходит сбой.Я извлек строку, которая должна быть передана, что в точности соответствует тому, что мне нужно передать, но она вылетает из программы, если я пишу код, как сделано выше (для WriteFile ()).Когда я сохраняю длину строки, т.е. вручную устанавливаю параметр sizeof (tBuffer) равным 14, тогда программа запускается, но команда не выполняется, так как общий размер строки буфера равен 38. Срочно нужна помощь по этому вопросу.

Пожалуйста, дайте мне знать.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Это неправильно: sizeof(TCHAR).Поскольку вы используете char, вы должны использовать sizeof(char).TCHAR может быть 1 или 2 байта ...

При вызове WriteFile вы должны использовать Length вместо sizeof(tBuffer).В противном случае вы, вероятно, получите в вашем файле данные для мусора (которые, как я полагаю, позже будут прочитаны откуда-то еще).

1 голос
/ 27 сентября 2011

Я предполагаю, что он вылетает, потому что вы пытаетесь запустить его прямо из вашей DLL.Функция записи выглядит хорошо для меня, и я думаю, что если вы попытаетесь запустить вашу программу из сценария Python ТОЛЬКО , она должна работать.Я сталкивался с чем-то подобным ранее и пришел к выводу, что не нужно запускать мою DLL через отладчик, а только через скрипт.

Пожалуйста, прочитайте this и this для получения дополнительной информации.

Надеюсь, это поможет.

Удачи!

...