Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.239.77] |
|
Страницы: (8) 1 2 [3] 4 5 ... 7 8 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Потихоньку врубаюсь. Глубоко понять MFC - это еще не скоро. Создал пустой проект с названием MFCtest. В результате имеются 2 файла типа CMFCtest.cpp MFCtestDlg.cpp
Пока пытаюсь тупо перенести код из Builder6 в файл типа CMFCtest.cpp .Глобальные переменные и функции разместил сразу после #include "stdafx.h" #include "MFCtest.h" #include "MFCtestDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif void __fastcall TForm1::FormCreate(TObject *Sender) reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL); Хотя читал, что MFC требует такого создателя потока reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE); И тем не менее подскажите please куда необходимо разместить функцию создания потока? Вариант размещения создателя потока так ... // CMFCtestApp BEGIN_MESSAGE_MAP(CMFCtestApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CMFCtestApp construction CMFCtestApp::CMFCtestApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance // скорость бод по умолчанию BaudR = CBR_115200; //reader = CreateThread( NULL, 0, ReadThread, NULL, CREATE_SUSPENDED, NULL); reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE); ::Sleep(10); } // The one and only CMFCtestApp object CMFCtestApp theApp; // CMFCtestApp initialization BOOL CMFCtestApp::InitInstance() { // InitCommonControlsEx() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // Set this to include all the common control classes you want to use // in your application. InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); ... выдает ошибку Error 1 error C2665: 'AfxBeginThread' : none of the 2 overloads could convert all the argument types |
Сообщ.
#32
,
|
|
|
Цитата Acvarif @ Дальше пытаюсь понять где находится аналог билдеровского создателя формы void __fastcall TForm1::FormCreate(TObject *Sender) reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL); в файл MFCtestDlg.cpp можно в конструктор или вирт функцию OnInitilize Добавлено Цитата Acvarif @ Хотя читал, что MFC требует такого создателя потока reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE); код который создал мастер студии вообще не трогай, чтобы там что то менять надо хорошо разбираться в MFC |
Сообщ.
#33
,
|
|
|
Код не трогаю. Перенес глобальные переменные и функции из CMFCtest.cpp в MFCtestDlg.cpp
Создание потока разместил после коммента // TODO: Add extra initialization here BOOL CMFCtestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE); return TRUE; // return TRUE unless you set the focus to a control } Опять ошибка Error 1 error C2665: 'AfxBeginThread' : none of the 2 overloads could convert all the argument types Если не сложно, покажите пожалуйста в коде как сделать конструктор для ReadThread, чтобы правильно разместить его вызов в CMFCtestDlg::OnInitDialog(). |
Сообщ.
#34
,
|
|
|
зачем AfxCreateThread? юзай CreateThread ты же её ранее вызывал.
функция AfxBeginThread возвращет указатель на CWndThread: CWndThread* pThread = AfxBeginThread(ReadThread,GetSafeHwnd(),THREAD_PRIORITY_IDLE); у тебя reader это HANDLE а не указатель. ReaderThread должен объявлен так: UINT ReaderThread(LPVOID); |
Сообщ.
#35
,
|
|
|
Спасибо.
Поток вроде запустился, и даже COMport = CreateFile... сработал. Интересно есть-ли в MFC аналог билдеровского Form1->Memo2->Lines->Add(stroka); которое работает непосредственно в функции потока чтения COM? |
Сообщ.
#36
,
|
|
|
Цитата Acvarif @ Интересно есть-ли в MFC аналог билдеровского Form1->Memo2->Lines->Add(stroka); конечно есть насколько я понял Memo2 это текстовый контрол, в MFC это контрол Edit. |
Сообщ.
#37
,
|
|
|
Да. Нашел. Все же MFC тяжелый для пнимания. Совершенно не врубаюсь как повторить простейший билдеровский ввод текста из ComboBox1 типа
Form1->ComboBox1->Text.c_str() Как это выглядит для MFC? |
Сообщ.
#38
,
|
|
|
Цитата Acvarif @ Да. Нашел. Все же MFC тяжелый для пнимания. Совершенно не врубаюсь как повторить простейший билдеровский ввод текста из ComboBox1 типа Form1->ComboBox1->Text.c_str() Как это выглядит для MFC? есть несколько вариантов самый простой: SetDlgItemText(IDC_EDIT, _T("Привет мир!!!")); IDC_EDIT это идентификатор эдита или так CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO); pCombo->InsertString(-1, _T("Текст")); |
Сообщ.
#39
,
|
|
|
Спасибо. Функция SetDlgItemText рабтает. Наверняка для вывода данных в оно Edit Control тоже пойдет.
Очевидно я неверно задал вопрос. Имелось ввиду обратное - из окна ввода (или списка ComboBox) перенести текст, напрмер в переменную-строку типа CString com_port ... Спасибо. Понял. Работает. |
Сообщ.
#40
,
|
|
|
получить текст можно с помощью GetDlgItemText.
|
Сообщ.
#41
,
|
|
|
Цитата Acvarif @ Потихоньку врубаюсь. Глубоко понять MFC - это еще не скоро. Это довольно старая библиотека. А это значит, что можно найти немало книг и статей. Интересная статья Хороший сайт |
Сообщ.
#42
,
|
|
|
Спасибо. Тоже работает. Попытаюсь этой функцией перенести текст типа "COM1" в переменную CString com_pot, а затем в функцию
COMport = CreateFile(com_port,GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); oid Com_Setting() { COMMTIMEOUTS timeouts; // com_port += ComboBox1->Text; // COMport = CreateFile(L"COM1",GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); COMport = CreateFile(com_port,GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if(COMport==INVALID_HANDLE_VALUE) { if(GetLastError()==ERROR_FILE_NOT_FOUND) { MessageBox(NULL,(LPCWSTR)L"serial port does not exist.",(LPCWSTR)L"",MB_OK); } MessageBox(NULL,(LPCWSTR)L"serial port error",(LPCWSTR)L"", MB_OK); } DCB dcbSerialParams = {0}; dcbSerialParams.DCBlength=sizeof(dcbSerialParams); if (!GetCommState(COMport, &dcbSerialParams)) { MessageBox(NULL,(LPCWSTR)L"getting state error\n",(LPCWSTR)L"",MB_OK); } dcbSerialParams.BaudRate=BaudR; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if(!SetCommState(COMport, &dcbSerialParams)) { MessageBox(NULL,(LPCWSTR)L"error setting serial port state\n",(LPCWSTR)L"",MB_OK); } // Установка таймаутов. timeouts.ReadIntervalTimeout = 10; // таймаут между двумя символами timeouts.ReadTotalTimeoutMultiplier = 0; // общий таймаут операции чтения timeouts.ReadTotalTimeoutConstant = 0; // константа для общего таймаута операции чтения timeouts.WriteTotalTimeoutMultiplier = 0; // общий таймаут операции записи timeouts.WriteTotalTimeoutConstant = 0; // константа для общего таймаута операции записи // Загрузить структуру таймаутов в порт. if(!SetCommTimeouts(COMport, &timeouts)) { // Если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния. MessageBox(NULL,(LPCWSTR)L"Не удалось установить тайм-ауты\n",(LPCWSTR)L"",MB_OK); return; } // Установить размеры очередей приёма и передачи SetupComm(COMport,2000,2000); // Очистка буферов порта PurgeComm(COMport,PURGE_RXCLEAR); // очистить строку имени порта // com_port = ""; } |
Сообщ.
#43
,
|
|
|
ну получилось?
|
Сообщ.
#44
,
|
|
|
Получается. Для проверки делаю так: По клику Button1 формирую строку типа "COM1" переношу ее в IDC_COMBO1 затем из IDC_COMBO1 извлекаюь строку в переменную str и потом вызываю функцию установок и открытия COM порта, где переменная str попадает в
COMport = CreateFile(str, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);. void CMFCtestDlg::OnBnClickedButton1() { CString strText(_T("COM1")); SetDlgItemText(IDC_COMBO1, strText); CString str; GetDlgItemText(IDC_COMBO1, str); // установки порта Com_Setting(str); // активировать поток чтения данных в порт ResumeThread(reader); } Порт открывается. Поток вроде запускаетс. Пока не врубаюсь как составить список в ComboBox1 типа ("COM1" "COM2" "COM3" ..) |
Сообщ.
#45
,
|
|
|
Цитата Acvarif @ Пока не врубаюсь как составить список в ComboBox1 типа ("COM1" "COM2" "COM3" ..) а что сложного? CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBOID); pCombo->AddString("COM1"); pCombo->AddString("COM2"); pCombo->AddString("COM3"); |