Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1

Помогите найти ошибку при создании потока в MFC

13.11.2014, 16:29. Показов 1500. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь создать поток, выводит ошибку:
отсутствуют экземпляры перегруженная функция "AfxBeginThread", соответствующие списку аргументов типы аргументов: (UINT (LPVOID pParam), CMainDlg *)

если объявить функцию static то не видны переменные m_RData, которая привязана к элементу управления editcontrol

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//ФУНКЦИЯ ОБЪЯВЛЕННАЯ В КЛАССЕ
UINT MyThread(LPVOID pParam);
 
 
 
 
 
UINT  CMainDlg::MyThread(LPVOID pParam){
 
    while (1)
    {
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
          ReadFile(theApp.hFile2, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
          if (iSize > 0) {
        
              m_RData+=sReceivedChar;
              UpdateData(FALSE);
          }  // если что-то принято, выводим
            
 
      }
}
}
 
 
 
 
 
void CMainDlg::OnBnClickedButton4()
{
 
//ошибка  
    AfxBeginThread(MyThread,this);
    
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2014, 16:29
Ответы с готовыми решениями:

Ошибка при создании окна сообщений. mfc
void Cprogr1Dlg::OnBnClickedButton1() { MessageBox("Привет!"); } Подчеркивает "Привет!", и выводит ошибку: Error: аргумент...

Иконка "MFC" при создании AppWizardом приложения
Как избавиться или заменить иконку программки на на свою и где? Никак не меняется.

Ошибка при создании потока
Добрый вечер, собственно задача состоит в том, что бы написать програмку для взаимодействия с приборчиком(капнограф) через виртуальный COM,...

7
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.11.2014, 17:24
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CMainDlg
{
    // ФУНКЦИЯ ОБЪЯВЛЕННАЯ В КЛАССЕ
    static UINT MyThread(LPVOID pParam);
 
};
 
UINT CMainDlg::MyThread(LPVOID pParam)
{
    CMainDlg* dlg = (CMainDlg*)pParam;
    
    // тут вся дальнейшая шняга с доступом к текущему объекту через dlg....
    
}
 
void CMainDlg::OnBnClickedButton4()
{
     //ошибка    
    CWinThread* pThread = AfxBeginThread(&CMainDlg::MyThread, (LPVOID)this);
    
}
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
13.11.2014, 18:00  [ТС]
CheshireCat, да я так и сделал спс, теперь есть доступ к элементам управления через dlg но не могу вызвать функцию updatedata пришлось у другом обработчике её использовать
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.11.2014, 18:08
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

Ээээ, нет! Учти, что архитектура MFC такова, что доступ ко всем без исключения наследникам CWnd можно безопасно производить только из того же потока, в котором они были созданы. Т.е. из главного потока приложения.

Если ты хочешь по ходу выполнения вычислений в теле рабочего потока что-то делать с визуальными элементами - посылай главному окну сообщения функцией PostMessage и обрабатывай их в нем.
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
14.11.2014, 12:47  [ТС]
CheshireCat, а как остановить этот поток?
C++
1
AfxEndThread(MyThread,TRUE)
не работает
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
14.11.2014, 13:07
Если ты хочешь завершить поток - просто пошли ему сигнал (CEvent) к завершению. А поток пусть сам решает, когда ему можно будет безопасно завершиться.

Внутри функции потока нужно периодически проверять - не пришел ли еще сигнал на завершение? Это делается с помощью одной из функций группы WaitFor.... И если пришел, то поток должен выполнить все завершающие действия (ну там типа сохранения критических данных в файл....) и тихо-мирно завершиться - умереть своей смертью.
0
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
14.11.2014, 17:15  [ТС]
CheshireCat, извините но не очень понятно можете помочь


Функция которая отправляет команду по RS
C++
1
2
3
4
5
6
7
8
9
void CMainDlg::OnBnClickedButton3()
{
    UpdateData(TRUE);
    CString s=m_Command.Trim()+"\n";
    DWORD dwBytesWritten;  
    Sleep(10000);
    BOOL iRet = WriteFile (theApp.hFile2,s,s.GetLength(),&dwBytesWritten,NULL);
    UpdateData(FALSE);
}
и две функции которые создаёт поток и читает данные из RS
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void CMainDlg::OnBnClickedButton4()
{
    
     AfxBeginThread(MyThread,this);   
        
}
 
 
 
UINT  CMainDlg::MyThread(LPVOID pParam){
 
    while (1)
    {
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
          ReadFile(theApp.hFile2, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
          if (iSize > 0) {
              CMainDlg* This=(CMainDlg*)pParam;
             This->m_RData+=(CString)sReceivedChar;
          }  // если что-то принято, выводим
            
      }
      return true;
    }
 
}
При запуска потока программа читает данные из RS и если попытаться отослать данные то программа крашится так как происходит одновременное обращение к RS можно как то сделать допустип на время отправки команды остановить поток на чтение и запустить дальше
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
14.11.2014, 17:28
Да сделать разделение ресурса (RS232) с помощью, например, критической секции, - это раз плюнуть. Вот только мне почему-то кажется, что дело таки не в этом..............
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2014, 17:28
Помогаю со студенческими работами здесь

Вылетает при создании потока
При выключенном Bluetooth, запуская приложение у меня включается блютуз, но выдаёт ошибку создания потока: 02-15 13:31:26.111...

Ошибка при создании потока
uses System.Threading; procedure Add(); begin for var i := 0 to 9 do Writeln(i); end; begin var T := new...

Ошибка при создании потока
Почему возникает ошибка: 1>c:\users\егор\desktop\fun_to__\fun_to__\fun+\dir\mainfile.h(17) : error C2664: _beginthread: невозможно...

Ошибка при создании потока
An unhandled exception of type 'System.ArgumentException' occurred in WindowsBase.dll Additional information: Необходимо создать...

Найти коэффициент при 10 степени в разложении бинома Ньютона (помогите найти ошибку).
"После умножения скобок и приведения подобных в полиноме будет слагаемое с x**10. Перед ним стоит ОДИН коэффициент. Напишите ответ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru