Показано с 1 по 7 из 7

Тема: Многопоточное приложение

  1. #1

    По умолчанию Многопоточное приложение

    Пишу диплом в Builder C++ 6.0, разработка ПО для управления многосвязным объектом.
    Используются приборы ОВЕН: МВА8, МВУ8, АС3, ТРМ151.
    Возникает проблема: при опросе в одном цикле нескольких каналов одного прибора МВА программа подвисает(она должна в реальном времени рисовать графику на OpenGL). Подскажите пожалуйста как сделать более грамотно многопоточное чтение, чтобы например каждый канал читался отдельным потоком и манипулировал прочитанными данными. При попытке открывать порт (один и тоже) в каждом потоке - ошибка "Порт занят". Попытка выбрать порт (SelectPort(...) ) также неудачна. Можно ли одновременно читать разными потоками с одного СОМ порта функциями, определенными в dll??? Можете написать на s_sergey@mail.ru
    Последний раз редактировалось SSV_VGTA; 31.03.2008 в 11:55.

  2. #2

    По умолчанию

    Цитата Сообщение от SSV_VGTA Посмотреть сообщение
    Пишу диплом в Builder C++ 6.0, разработка ПО для управления многосвязным объектом, включая синтез математической модели и синтез управляющей части.При этом используются приборы ОВЕН: МВА8, МВУ8, АС3, ТРМ151.
    Возникает проблема: при опросе в одном цикле нескольких каналов одного прибора МВА программа подвисает(она должна в реальном времени рисовать графику на OpenGL). Подскажите пожалуйста как сделать более грамотно многопоточное чтение, чтобы например каждый канал читался отдельным потоком и манипулировал прочитанными данными. При попытке открвать порт (один и тоже) в каждом потоке - ошибка "Порт занят". Попытка выбрать порт (SelectPort(...) ) также неудачна. Можно ли одновременно читать разными потоками с одного СОМ порта функциями, определенными в dll??? Можете написать на s_sergey@mail.ru
    А зачем читать разные каналы в разных потоках? Чтобы было? Или задание - сделать программу с 1000 потоков?
    Других причин так извращаться не вижу. В 1 потоке откройте порт и по очереди опрашивайте нужные Вам каналы, приборы, параметры. Конфликтов не будет.

  3. #3

    По умолчанию

    Спасибо. Попробую.

  4. #4

    По умолчанию

    все равно проблема: при создании потока таким образом (при нажатии на копку):
    {
    //...
    _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

  5. #5
    Пользователь
    Регистрация
    18.03.2007
    Адрес
    г. Краснодар
    Сообщений
    233

    По умолчанию

    Я писал на делфи, но без потоков.

    Определил таймер с нужным периодом опроса.
    По событию таймер останавливал.
    Потом опрашивал необходимые устройства.
    Перезапускал таймер.

    Проблем не было.

    PS но таймер был Thread.

  6. #6

    По умолчанию

    Цитата Сообщение от SSV_VGTA Посмотреть сообщение
    Результат выполнения функции res = -2 (ERR_NO_RESOURCE) попытка использовать неинициализированный ресурс.
    откройте порт в том потоке, в котором вы его используете.

  7. #7

    По умолчанию

    Цитата Сообщение от Дмитрий Егоренков Посмотреть сообщение
    откройте порт в том потоке, в котором вы его используете.
    Спасибо. Заработало!

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •