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

Тема: Не могу разобраться в чём проблема. MFC С++ TMP-251. Библиотека: owen.

  1. #1

    Question Не могу разобраться в чём проблема. MFC С++ TMP-251. Библиотека: owen.

    Доброго времени суток. Надеюсь, что не займу у вас много времени.

    Мне нужно было сделать программу, которая с определённым интервалом опрашивала бы прибор и записывала значение в файл. Работаю я на VS2010 C++ приложение на основе диалоговых окон.

    Для начала скажу, подключиться к прибору и считывать значение у меня удалось. Всё это я сделал в "тестовой кнопке", т.е. в одном потоке. А вот когда начал всё разносить по разным кнопкам столкнулся с проблемой.

    В кнопке старт я открываю порт (OpenPort) и делаю активным (SelectPort). Во второй кнопке Start я устанавливаю параметр (STP = true). В этой же кнопке я перехожу в функцию в которой и будут считываться значения и пока я не нажму на другую кнопку, где параметр установится в STP = false. В самой функции у меня есть цикл while(STP) в нём то и находится ReadIEEE32, с помощью которого я считываю значения температуры. Но при считывании мне выдаётся код ошибки -2, т.е. нет открытого порта.

    Читал на форуме, что может помочь перейти на новую библиотеку и сделать порт активным, но это не сработало. Работать в одном потоке нет возможности, так как нужно выходить из цикла.

    Подскажите пожалуйста, как можно решить данную ситуацию. Заранее спасибо.

  2. #2
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Если вы явно не создавали новых потоков (CThread, CWinThread или как их там), то всё у вас в одном потоке на самом деле. Кнопки не создают новых потоков, а отправляют сообщения для дальнейшей их обработки в оконной процедуре, которая в MFC реализована как статический метод класса окна. Далее по привязанным к аргументам этого метода указателям на экземпляр класса окна управление передаётся методам этого экземпляра.

    Есть подозрение, что вы тупо вешаете поток обработчика своим циклом, т.к. вразумительного описания многопоточности в вашем сообщении я не вижу. Может, проект покажете?

  3. #3

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Если вы явно не создавали новых потоков (CThread, CWinThread или как их там), то всё у вас в одном потоке на самом деле.
    Прошу прощения за невнимательность, как раз таки я самостоятельно новый поток делаю (HIOThread).

    Цитата Сообщение от Yegor Посмотреть сообщение
    Может, проект покажете?
    Конечно.
    Вложения Вложения

  4. #4
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    SelectPort задаёт контекст только в своём потоке. Попробуйте перед while (STP) вставить ..<ccomstm32dlg*>. так, стоп, тупой форум съедает код. В общем, разберётесь:
    Код:
    </ccomstm32dlg*>SelectPort(static_cast ЗНАК_МЕНЬШЕ CCOMSTM32Dlg* ЗНАК_БОЛЬШЕ (pParam)->nom_com);<ccomstm32dlg*>
    </ccomstm32dlg*>while(STP)
    {
    	GetLocalTime(&systime);<ccomstm32dlg*>
    <ccomstm32dlg*><ccomstm32dlg*>У меня при этом возврат ReadIEEE32 меняется с −2 на −102 (таймаут). То есть вроде как работает.</ccomstm32dlg*></ccomstm32dlg*></ccomstm32dlg*>
    Последний раз редактировалось Yegor; 19.03.2015 в 06:22.

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    То есть вроде как работает.
    Большое спасибо за помощь, всё работает.

    А вот ещё хотел бы спросить. Каким способом можно выводить значение температуры в реальном времени на экран? Т.е. если бы я делал это всё в кнопке, использовал бы EditControl с привязанной переменной и с помощью UpdateData(false) посылал бы новое значение каждый раз. Но в новом потоке данную функцию нельзя использовать. Или же я её не правильно объявляю? Можно ли как-нибудь функцию UpdateData(false) использовать в новом потоке?

  7. #7
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    В потоке опроса отправляйте сообщение своему окну через PostMessage, а в обработчике сообщений обновляйте данные тем же UpdateData или SetWindowText (например).

  8. #8

    По умолчанию

    Спасибо за пример, попробую разобраться.

Похожие темы

  1. Не могу разобраться с ТРМ-202
    от Хитрожопый негр в разделе Эксплуатация
    Ответов: 12
    Последнее сообщение: 23.02.2015, 12:51
  2. Не могу разобраться с адресами
    от Stas в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 06.06.2013, 14:01
  3. Ответов: 9
    Последнее сообщение: 12.05.2010, 08:45
  4. Не могу разобраться с ошибками
    от Мухин Сергей в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 21.03.2008, 16:57

Метки этой темы

Ваши права

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