PDA

Просмотр полной версии : Многопоточное приложение



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
откройте порт в том потоке, в котором вы его используете.

Спасибо. Заработало! :)