С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69

Изменение контролов MFC из другого потока AFxBeginThread

04.11.2013, 14:21. Показов 4806. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что то не получается изменять контролы MFC из другого потока , знаю что это можно делать , хотя и говорят что изменять можно только из потока в котором создан контрол , да дело даже не в этом пытаюсь запустить даже другую функцию и приложение падает , Что делать ???

Выглядит примерно все вот так вот

C++
1
2
SetTerminate(true);                                             // перед запуском потока присоим флагу true
Thread = AfxBeginThread(StartReadSymbolThread,GetSafeHwnd());   //Запуск отделного потока для чтения данных из другого приложения

C++
1
2
3
 void* pMainDlg = PointerObj();    // присвоим указатель на этот обьект MainDemoLauncherDlg что бы потом по нему можно было вызвать функцию из другого класса
ReadSymbolLine *pRSL= new ReadSymbolLine;  
void (ReadSymbolLine::*pStartReadSymbol)(void* pParam);  // указатель на функцию
C++
1
2
3
4
5
6
UINT StartReadSymbolThread(LPVOID param)  //  функция которая передается в отдельный поток  AfxBeginThread
{
    pStartReadSymbol=&ReadSymbolLine::StartReadSymbol;
    (pRSL->*pStartReadSymbol)(pMainDlg);// Вызов  - передаем туда указатель на обьект  MainDemoLauncherDlg
    return 0;   // вернем 0 что бы закончить поток
}

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Функция читает запрашиваеммый символ от клиента
 void ReadSymbol(void * pPapam) 
{  
        
    // принимаем указатель на void
    MainDemoLauncherDlg *pDlg=(MainDemoLauncherDlg*)pPapam; // приводим его к типу класса MainDemoLauncherDlg так как на самом деле мы будем  запехивать в эту функцию указатель на обьект класса
        
    bool (MainDemoLauncherDlg::*pGetTerminate)(void);           // указатель на свойства где хранится значение флага продолжения потока
    pGetTerminate=&MainDemoLauncherDlg::GetTerminate;           
 
    void (MainDemoLauncherDlg::*pSetSymbol)(CString symbol);           // указатель на свойства где хранитьца значение флага продолжения потока
    pSetSymbol=&MainDemoLauncherDlg::SetSymbol;           
 
 
    bool flag = (pDlg->*pGetTerminate)();                       // флаг запуска и остановки потока
 
        
    CString readSymbol="";   // здесь сохраним Тикер
    int readflag;            // флаг успешного чтения с потока
 
 
    while (flag)            //Цикл- Это надо что бы функция не заканчивалась после приемки первого сообщения
     {   
 
          DWORD cbRead;
          char szBuffReadSymbol[10];    // буфер для чтения тикера // возможно надо обнулить
          DWORD dwBytesToRead = (DWORD)strlen(szBuffReadSymbol); // длинна строки
          
          readflag = ReadFile(hPipeNameLineReadSymbol,szBuffReadSymbol,dwBytesToRead,&cbRead,NULL); // читаем из канала в буфер 
         
          flag =(pDlg->*pGetTerminate)();               // прочитаем еще раз флаг перед отправкой тикера
          
              if(readflag > 0)                           // readflag - если больше нуля то то прочитали с того конца 
              {   
                  for (int i = 0; i < (int)cbRead; i++)
                  {
                     readSymbol += szBuffReadSymbol[i];  // записываем в переменную только то что прочитали а не весь буфер
                  }
                            
                  if(flag==true)                         // если еще флаг равен тру то продолжаем 
                  {
                    (pDlg->*pSetSymbol)(readSymbol);      // вызываем свойство присвоения нового тикера                            
                     readSymbol="";                       // обнуляем переменную
 
 
                    
                  }
                  else
                  {
                       break; 
                  }
              }
              else  // если попадем сюда то функция ReadFile  завершилась с ошибкой тоесть равна 0   Чтобы получить дополнительные сведения об ошибке, вызовите GetLastError.
              {
                  break;
              }
          
     }
    
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2013, 14:21
Ответы с готовыми решениями:

AfxBeginThread() и изменение контролов
Я запускаю тред и мне нужно изменять контролы, но я не совсем понимаю как это делать. Вот функция: UINT WorkerThreadProc( LPVOID...

Получение доступа к функциям диалога из другого потока (mfc)
Всем доброго дня Возникла такая проблема. В классе диалогового окна создаем экземпляр класса для расчетов. Передаем данные и запускаем...

Изменение состояния контролов из вторичного потока
Здравствуйте, Столкнулся с такой проблемой: Имеется программа которая ищет локальные ссылки в html коде страницы и выводит их в...

34
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
04.11.2013, 14:25
Изменять контролы MFC из другого потока - крайне плохая идея. Изменять их разрешается только из того потока, в котором они были созданы. Так уж устроена MFC..... такие у нее правила.

(То есть, ты можешь попытаться изменить контрол из другого потока, язык тебе этого не запрещает. Но вот что произойдет в результате - неизвестно. Может, программа будет работать, а может - "упадет". Как карта ляжет.)
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 14:28  [ТС]
Вот так вот выглядит свойство в классе MainDemoLancherDlg

C++
1
2
3
4
5
6
7
8
9
10
void SetSymbol(CString value) // свойство 
    {     
        // будем использовать свойство как событие 
           v_editsymbolstring = value;   // присваиваем в контрол
               UpdateData(false);            // обновляем данные из переменной в контрол 
           symbol = value;
 
             
           func(); // при вызове ошибка !!!  хотя верхние операторы выполняет  ,но в Debug выскакивает ошибочка Assest
    }
Добавлено через 2 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
Изменять контролы MFC из другого потока - крайне плохая идея. Изменять их разрешается только из того потока, в котором они были созданы. Так уж устроена MFC..... такие у нее правила.

(То есть, ты можешь попытаться изменить контрол из другого потока, язык тебе этого не запрещает. Но вот что произойдет в результате - неизвестно. Может, программа будет работать, а может - "упадет". Как карта ляжет.)

А вот зачем тогда там потоки и нужны если это делать нельзя , ведь невозможно все сделать в одном потоке , у меня например около 10 циклов while крутятся , что их все в один поток засунуть , что делать то аа ???
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.11.2013, 14:34
Цитата Сообщение от aae1 Посмотреть сообщение
void SetSymbol(CString value)
что тебе мешает использовать SetWindowText
Или я что то не понимаю в твоей задаче?
UpdateData запускает DDE в которой сам черт ногу сломит
лично я давно ушел от UpdateData
SetWindowText GetWindowText мне хватает
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 14:54  [ТС]
А как он узнал что я из другого потока ??
Я создал свойство SetSymbol(CString value) в классе MainDemoLancherDlg - это же можно сказать обычная переменная а не контрол
поменял значение symbol = value; из другово потока , и уже сам контрол как бы попал под раздачу так как свойство поменялось , вот он и вызвался v_editsymbolstring = value; UpdateData(false); , я же не напрямую из другого потока вызвал во это v_editsymbolstring = value; UpdateData(false); Как он узнал ???

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
что тебе мешает использовать SetWindowText
Или я что то не понимаю в твоей задаче?
UpdateData запускает DDE в которой сам черт ногу сломит
лично я давно ушел от UpdateData
SetWindowText GetWindowText мне хватает

можно попробовать , а они быстро работают ??? , да задача то вообще даже и не в смене контролов в MFC , а я не могу вызвать функцию которую я написал в классе где создано MFC она как бы вызывается и сразу валиться все , а если отдельно эту функцию прявязать к кнопке то все отлично работает , вот в чем проблема

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void MainDemoLauncherDlg::func() // 
{   
                 
    (pTS->*pStartNewSymbolTS)(symbol); // эту функцию не вызвать из другого потока или через свойства будет ошибка , только с кнопки можно 
                                      // или попробовать через событие или пробовать делать синхронизацию потока , а может поменять на пользовательский поток 
 
    
}
 
 
void MainDemoLauncherDlg::OnBnClickedbtStop()
{   
    //func();
    (pTS->*pStartNewSymbolTS)(symbol);     // тут для пробы - работает тут
    
 
 
}
Добавлено через 40 секунд
на коментарии не смотрите ,это я для себя ,мысли пишу что еще попробовать можно что бы не забыть)))

Добавлено через 13 минут
видел где то что через это можно попробовать PostMessage. , только не сталкивался не знаю как
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.11.2013, 15:03
Цитата Сообщение от aae1 Посмотреть сообщение
это же можно сказать обычная переменная а не контрол
поменял значение symbol = value; из другово потока , и уже сам контрол как бы попал под раздачу так как свойство поменялось ,
очередь сообщений рушишь
Цитата Сообщение от aae1 Посмотреть сообщение
а я не могу вызвать функцию которую я написал в классе где создано MFC она как бы вызывается и сразу валиться все ,
скорее всего одновременный доступ к данным нужны всякие семафоры, мьютексы
Цитата Сообщение от aae1 Посмотреть сообщение
видел где то что через это можно попробовать PostMessage.
вот это лучше всего
можно и SendMessage
разница в том что SendMessage послала сообщение и ждет реакции
а PostMessage послало и забыло дальше работает
Цитата Сообщение от aae1 Посмотреть сообщение
можно попробовать , а они быстро работают ???
Ну все быстрее чем UpdateData
посмотри http://www.firststeps.ru/
может что полезное для себя найдешь
1
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 17:07  [ТС]
а как организовать прием сообщений ???
добавляю в общую карту вот это ON_MESSAGE(WM_MYMESSAGE,func) а он подчеркивает ошибку
что делать
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
04.11.2013, 17:17
вообще для обращение к контролам из другово потомка, передаем в LPARAM ссылку на этот контрол или родительское окно, приводим к нужному типу и меняем, но как говорили выше, там могу быть засады.

Добавлено через 1 минуту
Цитата Сообщение от aae1 Посмотреть сообщение
а как организовать прием сообщений ???
добавляю в общую карту вот это ON_MESSAGE(WM_MYMESSAGE,func) а он подчеркивает ошибку
что делать
WM_MYMESSAGE - наверное не обьявили definoм
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 17:25  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
вообще для обращение к контролам из другово потомка, передаем в LPARAM ссылку на этот контрол или родительское окно, приводим к нужному типу и меняем, но как говорили выше, там могу быть засады.


ну я примерно так и делал , только передавал указатель на весь класс а от туда уже брал конкретно то что нужно , вот и попал в засаду
Добавлено через 1 минуту


WM_MYMESSAGE - наверное не обьявили definoм
а вот это в ресурсах надо обьявить ?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.11.2013, 17:30
Цитата Сообщение от aae1 Посмотреть сообщение
а вот это в ресурсах надо обьявить ?
в любом заголовочном файле который подключен ко всем файлам проекта
я бы лучше отдельный файл
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 17:42  [ТС]
ValeryS ссылку которую мне дали , очень полезна мне будет , но там вот этот пример пробую себе добавить не получается http://www.firststeps.ru/ шаг 340

#define const WM_USERMSG = WM_USER+100;

возможно из за этого DECLARE_DYNAMIC(MainDemoLauncherDlg)
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
04.11.2013, 17:52
C++
1
#define WM_USERMSG WM_USER+100;
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 20:02  [ТС]
Карта сообщений правильно написана ?? ни чего не надо добавлять ??
всеравно он не видит ON_MESSAGE(WM_USERMSG,func) подчеркивает ON_MESSAGE

C++
1
2
3
4
5
6
7
8
BEGIN_MESSAGE_MAP(MainDemoLauncherDlg, CModelessDialog)  // Карта сообщений
    ON_WM_CLOSE()   
    ON_BN_CLICKED(IDC_bt_Start, OnBnClickedStart)   
    
    ON_BN_CLICKED(IDC_bt_Stop, &MainDemoLauncherDlg::OnBnClickedbtStop)
    ON_MESSAGE(WM_USERMSG,func)
 
END_MESSAGE_MAP()
вот так вот остальное сделано
#define WM_USERMSG WM_USER+100;

функция
afx_msg LRESULT func(WPARAM wParam, LPARAM lParam);


может что то еще надо подключить или добавить

Добавлено через 20 минут
требуется фигурнная скобка в карте сообщений , странно как то

Добавлено через 49 минут
Блин уже все перебрал , что то в проект не подключено наверное , помогите
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
04.11.2013, 20:42
напишите точную ошибку.
если пишет про открывающую/закрывающую фигурную скобку, скорее всего где то лишнюю написал. ищи.
можешь этот файл приложить
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 21:01  [ТС]
Дело в чем то другом если просто эту строчку закоментировать то все ошибки пропадают

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
// MainDemoLauncher.cpp : implementation file
//
 
#include "stdafx.h"
#include "MainDemoLauncherDlg.h"
#include "FullQuote.h"
 
 
  
 
 
// MainDemoLauncher dialog
 
IMPLEMENT_DYNAMIC(MainDemoLauncherDlg, CModelessDialog)
 
void* pMainDlg;  // тут будем хранить указатель  на обьект класса MainDemoLauncherDlg
 
CWinThread* Thread;  // отдельный поток
 
TimeSales *pTS;  // указатель на класс
TimeSales TS;    // Создаем обьект
void (TimeSales::*pStartNewSymbolTS)(CString symbol);    // указатель на функцию обьявляем тут , для доступа из других мест
 
 
BookLevel *pBL;
BookLevel BL;
void  (BookLevel::*pStartNewSymbolBL)(CString symbol);   // указатель на функцию обьявляем тут , для доступа из других мест
 
 
ReadSymbolLine *pRSL;
ReadSymbolLine  RSL;  // Создаем обьект  вызвать метод без обьекта нельзя , если нет инициализированного указателя на обьект 
void (ReadSymbolLine::*pStartReadSymbol)(void* pParam);  // указатель на функцию обьявляем тут , для доступа из других мест
 
 
 
 
//CString symbol = "";
 
 
 
MainDemoLauncherDlg::MainDemoLauncherDlg(CWnd* pParent /*=NULL*/)
    : CModelessDialog(MainDemoLauncherDlg::IDD, pParent)
    , m_StatusEdit(CEdit())
    , v_editsymbolstring(_T(""))
{
     
}
 
MainDemoLauncherDlg::~MainDemoLauncherDlg()
{
    L_DetachFromAppNotifier(this);
    L_UnsubscribeFromMarketStatus(this);
}
 
 
BOOL MainDemoLauncherDlg::Create(CWnd *pParentWnd /*= CWnd::FromHandle(L_GetMainWnd())*/)
{
 
    
    return __super::Create(MainDemoLauncherDlg::IDD, pParentWnd);
}
 
void MainDemoLauncherDlg::DoDataExchange(CDataExchange* pDX)
{
    __super::DoDataExchange(pDX);
 
    DDX_Control(pDX, IDC_STATUSEDIT, m_StatusEdit);
    DDX_Control(pDX, IDC_CHECK_WriteTS, v_checkTS);
    DDX_Control(pDX, IDC_CHECK_BookLV, v_checkLV);
    DDX_Control(pDX, IDC_CHECK_Chart, v_checkChart);
    DDX_Control(pDX, IDC_CHECK_ConstData, v_checkConstData);
    DDX_Control(pDX, IDC_CHECK_Order, v_checkOrder);
    DDX_Control(pDX, IDC_CHECK_readSymbol, v_checkReadSymbol);
    DDX_Text(pDX, IDC_EDIT_SYMBOL, v_editsymbolstring);
}
 
BOOL MainDemoLauncherDlg::OnInitDialog()
{
    __super::OnInitDialog();    
     
    L_AttachToAppNotifier(this);
    L_SubscribeToMarketStatus(this);
    UpdateStatus();
    
    return TRUE;
}
 
void MainDemoLauncherDlg::UpdateStatus()  // статус соединения с рынком
{
    
}
 
 
 
  void MainDemoLauncherDlg::HandleMessage(L_Message const *pMsg) 
  {
    
  }
 
 
 
BEGIN_MESSAGE_MAP(MainDemoLauncherDlg, CModelessDialog)  // Карта сообщений
    ON_WM_CLOSE()   
    ON_BN_CLICKED(IDC_bt_Start, OnBnClickedStart)   
    
    ON_BN_CLICKED(IDC_bt_Stop, &MainDemoLauncherDlg::OnBnClickedbtStop)
    
    ON_MESSAGE(WM_USERMSG,func)
    
END_MESSAGE_MAP()
 
// MainDemoLauncher message handlers
 
void MainDemoLauncherDlg::OnClose()
{
    
}
 
 
UINT StartReadSymbolThread(LPVOID param) 
{
    pStartReadSymbol=&ReadSymbolLine::StartReadSymbol;
    (pRSL->*pStartReadSymbol)(pMainDlg);                       // Вызов  - передаем туда указатель на обьект  MainDemoLauncherDlg
    return 0;   // вернем 0 что бы закончить поток
}
 
void MainDemoLauncherDlg::OnBnClickedStart()  // При Нажатии на кнопку  
{
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if(v_checkTS.GetCheck()!=0)  // проверка на наличие включеного чека для передачи Time&Sales
    {        
        pTS = new TimeSales();            // Создаем указатель и выделяем память под обьект 
        pTS=&TS;                        // Инициализация указателя адресом обьекта
 
      BOOL (TimeSales::*pOnInitTimeSales)();  // указатель на метода класса
      pOnInitTimeSales=&TimeSales::OnInitTimeSales; 
      
      void (TimeSales::*pCreateLine)(void); // указатель на метод класса
      pCreateLine=&TimeSales::CreateLine;
     
      
      pStartNewSymbolTS=&TimeSales::StartNewSymbol;       // указателю на функцию присваиваем адрес , обьявлен выше что бы был доступен из другого места
 
      (pTS->*pOnInitTimeSales)();         //Вызов метода (Инициалиация экземпляра) 
      (pTS->*pCreateLine)();
      (pTS->*pStartNewSymbolTS)("");                       
 
    }
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if(v_checkLV.GetCheck()!=0)  
    {
     pBL= new BookLevel;          // Создаем указатель и выделяем память под обьект
    // pBL=&BL;
 
     BOOL  (BookLevel::*pOnInitBookLevel)(void);
     pOnInitBookLevel=&BookLevel::OnInitBookLevel;
     
     void  (BookLevel::*pCreateLine)(void);  
     pCreateLine=&BookLevel::CreateLine;
 
     pStartNewSymbolBL=&BookLevel::StartNewSymbol;   // указателю на функцию присваиваем адрес , обьявлен выше что бы был доступен из другого места
 
     (pBL->*pOnInitBookLevel)();
     (pBL->*pCreateLine)();
     (pBL->*pStartNewSymbolBL)("");
    }
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if(v_checkReadSymbol.GetCheck()!=0)   // Для чтения Тикера
    {   
        
     pMainDlg = PointerObj();    // присвоим указатель на этот обьект MainDemoLauncherDlg что бы потом по нему можно было вызвать функцию из другого класса
     pRSL= new ReadSymbolLine;   // Создаем указатель и выделяем память указанного типа под  будующий обьект 
    // pRSL=&RSL;                  // Присваиваем указателю адрес обьекта
 
     BOOL  (ReadSymbolLine ::*pOnInitReadSymbol)(void);     // указатель на метод в классе
     pOnInitReadSymbol=&ReadSymbolLine ::OnInitReadSymbol;  // присваиваем указателю на метод класса - адрес метода
     
 
     void (ReadSymbolLine ::*pCreateLine)(void);            // указатель на метод в классе
     pCreateLine=&ReadSymbolLine ::CreateLine;              // присваиваем указателю на метод класса - адрес метода
 
     (pRSL->*pOnInitReadSymbol)();                          // Вызываем пока что пустая--возможно и не нужна будет
     (pRSL->*pCreateLine)();                                // Вызов  -- создаем канал для приема Тикера
    
 
     SetTerminate(true);                                             // перед запуском потока присоим флагу true
     Thread = AfxBeginThread(StartReadSymbolThread,GetSafeHwnd());   //Запуск отделного потока для чтения данных из другого приложения   
    
             
    }
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    if(v_checkChart.GetCheck()!=0)
    {
     
    }
 
    if(v_checkConstData.GetCheck()!=0)
    {
     
    }
 
    if(v_checkOrder.GetCheck()!=0)
    {
     
    }
 
 
}
    
LRESULT MainDemoLauncherDlg::func(WPARAM wParam, LPARAM lParam)
{
 
     (pTS->*pStartNewSymbolTS)(symbol); // эту функцию не вызвать из другого потока или через свойства будет ошибка , только с кнопки можно 
     return 0;                              // или попробовать через событие или пробовать делать синхронизацию потока , а может поменять на пользовательский поток 
}
Добавлено через 5 минут
в Хедере

#define WM_USERMSG (WM_USER + 100);
afx_msg LRESULT func(WPARAM wParam, LPARAM lParam);

Добавлено через 54 секунды
// stdafx.h
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
39
40
41
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
 
#pragma once
 
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers
#endif
 
//#include "targetver.h"
 
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS  // some CString constructors will be explicit
 
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
 
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif // _AFX_NO_OLE_SUPPORT
 
#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>                      // MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT
 
#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>                     // MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT
 
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC support for Internet Explorer 4 Common Controls
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>                     // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
 
#include <set>
#include <vector>
#include <string>
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.11.2013, 21:01
Цитата Сообщение от aae1 Посмотреть сообщение
#define WM_USERMSG (WM_USER + 100);
скобки здесь зачем???
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 21:22  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
скобки здесь зачем???
я их убира и ставил , без разницы , просто в некоторых примерах со скобками
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
04.11.2013, 21:23
ON_MESSAGE(WM_USERMSG,&func)
если память не подводит, и напишите точную ошибку компилятора, если не будет пахать
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
04.11.2013, 21:28  [ТС]
когда навожу где подчеркивает пишет вот это define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \
(memberFxn)) },
for Windows messages
Error требуетс фигурная скобка

Добавлено через 1 минуту
14 IntelliSense: требуется фигурная скобка "}" c:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 136 2 LightspeedTraderAPIDemo
15 IntelliSense: имя, за которым следует выражение "::", должно определять класс или пространство имен c:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 8 error C2653: TheBaseClass: не является именем класса или пространства имен C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 6 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 13 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 143 1 LightspeedTraderAPIDemo
Ошибка 2 error C2143: синтаксическая ошибка: отсутствие "}" перед ";" C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 136 1 LightspeedTraderAPIDemo
Ошибка 5 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 12 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 143 1 LightspeedTraderAPIDemo
Ошибка 3 error C2143: синтаксическая ошибка: отсутствие ";" перед "," C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 136 1 LightspeedTraderAPIDemo
Ошибка 9 error C2065: GetThisMessageMap: необъявленный идентификатор C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 10 error C2065: _messageEntries: необъявленный идентификатор C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
Ошибка 11 error C2059: синтаксическая ошибка: return C:\Users\ANDREY\Documents\Visual Studio 2012\Projects\LightspeedTrader_1\samples \VS2010\LightspeedTraderAPIЛевел2иПринты 3ноября\LightspeedTraderAPIDemo\MainDemo LauncherDlg.cpp 138 1 LightspeedTraderAPIDemo
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
04.11.2013, 21:38
Цитата Сообщение от aae1 Посмотреть сообщение
я их убира и ставил , без разницы ,
я к тому что в макросе скобки опасны, а здесь не нужны, неправильно поставишь и в другом месте аукнется, типа лишняя скобка
ты вроде про это говорил

Добавлено через 4 минуты
Цитата Сообщение от aae1 Посмотреть сообщение
define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \
(memberFxn)) },
это тебе показывается во что развернется макрос
и здесь написан прототип функции
она должна быть методом класса производным от CWnd:: и вот эту фигню добавь к определению функции AFX_MSG_CALL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2013, 21:38
Помогаю со студенческими работами здесь

AfxBeginThread MFC C++ Хочу разобраться
Привет всем. Дорогие форумчане, наведите на правильную мысль. Пытаются создать отдельный поток из MFC приложения. Не могу понять: 1....

Изменение контрола из другого потока
Облазил все что только можно в интернете, но все действия приводят к этой ошибке. Причем по идее код указанный ниже и есть решение этой...

Изменение формы из другого потока
Добрый день. прошу прошения за избитую тему, но все же не могу разобраться как правильно делать у меня классы Graph_class_line01 ...

Изменение свойств из другого потока
Хочу получить доступ доступ к контролам MainWindows из другого окна.Но если объявлять Main Window MW= new MainWindow();, то изменение...

Изменение значения виджета из другого потока
Доброго времени суток. Продолжаю серию нубовских вопросов. Есть основной поток с окошком, кнопочками и текстедитом. По нажатию кнопочки...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru