Просмотр полной версии : Многопоточное приложение
SSV_VGTA
18.03.2008, 00:11
Пишу диплом в Builder C++ 6.0, разработка ПО для управления многосвязным объектом.
Используются приборы ОВЕН: МВА8, МВУ8, АС3, ТРМ151.
Возникает проблема: при опросе в одном цикле нескольких каналов одного прибора МВА программа подвисает(она должна в реальном времени рисовать графику на OpenGL). Подскажите пожалуйста как сделать более грамотно многопоточное чтение, чтобы например каждый канал читался отдельным потоком и манипулировал прочитанными данными. При попытке открывать порт (один и тоже) в каждом потоке - ошибка "Порт занят". Попытка выбрать порт (SelectPort(...) ) также неудачна. Можно ли одновременно читать разными потоками с одного СОМ порта функциями, определенными в dll??? Можете написать на s_sergey@mail.ru
Филоненко Владислав
18.03.2008, 08:14
Пишу диплом в Builder C++ 6.0, разработка ПО для управления многосвязным объектом, включая синтез математической модели и синтез управляющей части.При этом используются приборы ОВЕН: МВА8, МВУ8, АС3, ТРМ151.
Возникает проблема: при опросе в одном цикле нескольких каналов одного прибора МВА программа подвисает(она должна в реальном времени рисовать графику на OpenGL). Подскажите пожалуйста как сделать более грамотно многопоточное чтение, чтобы например каждый канал читался отдельным потоком и манипулировал прочитанными данными. При попытке открвать порт (один и тоже) в каждом потоке - ошибка "Порт занят". Попытка выбрать порт (SelectPort(...) ) также неудачна. Можно ли одновременно читать разными потоками с одного СОМ порта функциями, определенными в dll??? Можете написать на s_sergey@mail.ru
А зачем читать разные каналы в разных потоках? Чтобы было? Или задание - сделать программу с 1000 потоков? :D
Других причин так извращаться не вижу. В 1 потоке откройте порт и по очереди опрашивайте нужные Вам каналы, приборы, параметры. Конфликтов не будет.
SSV_VGTA
18.03.2008, 17:45
Спасибо. Попробую.
SSV_VGTA
31.03.2008, 12:11
все равно проблема: при создании потока таким образом (при нажатии на копку):
{
//...
_beginthread(ReadThread, 4096, 0);
//..
}
void ReadThread(void *pParam)
{
while(g_CanReading){
ReadingData();
Sleep(300);
}
_endthread();
}
void ReadingData()
{
//.....
int res = ReadIEEE32(addr, 0, "rEAd", Val, Time, -1);
//..
}
Результат выполнения функции res = -2 (ERR_NO_RESOURCE) попытка использовать неинициализированный ресурс.
Если же ReadingData() вызывается в таймере, то все нормально: res = 0.
Для работы использую библиотеку owen_io.dll
Сергей71
01.04.2008, 12:39
Я писал на делфи, но без потоков.
Определил таймер с нужным периодом опроса.
По событию таймер останавливал.
Потом опрашивал необходимые устройства.
Перезапускал таймер.
Проблем не было.
PS но таймер был Thread.
Дмитрий Егоренков
02.04.2008, 11:06
Результат выполнения функции res = -2 (ERR_NO_RESOURCE) попытка использовать неинициализированный ресурс.
откройте порт в том потоке, в котором вы его используете.
SSV_VGTA
07.04.2008, 00:18
откройте порт в том потоке, в котором вы его используете.
Спасибо. Заработало! :)
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot