PDA

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



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

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

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

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

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

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

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

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

IAGlushko
19.03.2015, 05:24
Если вы явно не создавали новых потоков (CThread, CWinThread или как их там), то всё у вас в одном потоке на самом деле.
Прошу прощения за невнимательность, как раз таки я самостоятельно новый поток делаю (HIOThread).


Может, проект покажете?
Конечно.

Yegor
19.03.2015, 06:17
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*>

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

IAGlushko
19.03.2015, 19:00
То есть вроде как работает.

Большое спасибо за помощь, всё работает.

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

Yegor
20.03.2015, 00:33
В потоке опроса отправляйте сообщение своему окну через PostMessage, а в обработчике сообщений обновляйте данные тем же UpdateData или SetWindowText (например (http://forums.codeguru.com/showthread.php?312454-MFC-Thread-How-to-access-UI-elements-from-a-thread-in-MFC)).

IAGlushko
20.03.2015, 05:46
Спасибо за пример, попробую разобраться.