DWORD WINAPI OnXXX(LPVOID ptr)
{
CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd();
int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем.
...............
OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка.
Здравствуйте, Аноним, Вы писали:
А>DWORD WINAPI OnXXX(LPVOID ptr) А>{ А> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А> ............... А>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка.
проверь, чем ты инициализируеш g_pMainWnd при создании главного окна приложения.
А у Вас нет кого нибудь с гравицаппой и пепелацем?
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Re[3]: Проблема с указателем
От:
Аноним
Дата:
06.07.05 08:55
Оценка:
Здравствуйте, MicroCell, Вы писали:
MC>пардон, m_pMainWnd
Немогу его вобше найти в своем диалоге
А вобще должно быть чтот вроде:
CMyDialog dlg;
m_pMainWnd = &dlg;
???
Re[4]: Проблема с указателем
От:
Аноним
Дата:
06.07.05 09:19
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, MicroCell, Вы писали:
MC>>пардон, m_pMainWnd
А>Немогу его вобше найти в своем диалоге А>А вобще должно быть чтот вроде: А>CMyDialog dlg; А>m_pMainWnd = &dlg; А>???
Нашол у меня CBISBackuper dlg;
m_pMainWnd = &dlg;
но прога всеравно вылетает.
Здравствуйте, Аноним, Вы писали:
А>DWORD WINAPI OnXXX(LPVOID ptr) А>{ А> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А> ............... А>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка.
Ты часом не пытаешься использрвать MFC из другого потока?
MFC не потокобезопасна
Re[2]: Проблема с указателем
От:
Аноним
Дата:
07.07.05 07:16
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Аноним, Вы писали:
А>>DWORD WINAPI OnXXX(LPVOID ptr) А>>{ А>> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А>> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А>> ............... А>>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка. LM>Ты часом не пытаешься использрвать MFC из другого потока?
LM>MFC не потокобезопасна
Там метод вызываетя из МКС класса а какже мне быть мне нуежн новый поток и MFC
Re[3]: Проблема с указателем
От:
Аноним
Дата:
07.07.05 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, Аноним, Вы писали:
А>>>DWORD WINAPI OnXXX(LPVOID ptr) А>>>{ А>>> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А>>> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А>>> ............... А>>>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка. LM>>Ты часом не пытаешься использрвать MFC из другого потока?
LM>>MFC не потокобезопасна А>Там метод вызываетя из МКС класса а какже мне быть мне нуежн новый поток и MFC
Пардон
Там метод вызываетя из MFC класса а какже мне быть мне нуежн новый поток и MFC
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, LuciferMoscow, Вы писали:
LM>>>Здравствуйте, Аноним, Вы писали:
А>>>>DWORD WINAPI OnXXX(LPVOID ptr) А>>>>{ А>>>> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А>>>> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А>>>> ............... А>>>>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка. LM>>>Ты часом не пытаешься использрвать MFC из другого потока?
LM>>>MFC не потокобезопасна А>>Там метод вызываетя из МКС класса а какже мне быть мне нуежн новый поток и MFC А>Пардон А>Там метод вызываетя из MFC класса а какже мне быть мне нуежн новый поток и MFC
Скажи по русски, что ты хочегь сделать(не переводя это на СИ++)
Здравствуйте, LuciferMoscow, Вы писали:
LM>Скажи по русски, что ты хочегь сделать(не переводя это на СИ++)
Функция должна резервировать данные. Тоесть копировать документы из одной папки в другую и в процессе выполнения резерворования программа недолжна зависать вот такая вот проблема поэтому я и решил использовать потоки.
«Были холопами, стали рабами». A.Пугачева.
Re[6]: Проблема с указателем
От:
Аноним
Дата:
14.07.05 08:54
Оценка:
Удалено избыточное цитирование.
Здравствуйте, _BIS_, Вы писали:
_BI>Функция должна резервировать данные. Тоесть копировать документы из одной папки в другую и в процессе выполнения резерворования программа недолжна зависать вот такая вот проблема поэтому я и решил использовать потоки.
Функция должна резервировать данные. Тоесть копировать документы из одной папки в другую и в процессе выполнения резерворования программа недолжна зависать вот такая вот проблема поэтому я и решил использовать потоки. S.O.S!!!
Здравствуйте, Аноним, Вы писали:
А>Функция должна резервировать данные. Тоесть копировать документы из одной папки в другую и в процессе выполнения резерворования программа недолжна зависать вот такая вот проблема поэтому я и решил использовать потоки. S.O.S!!!
Код этой функции в студию
Здравствуйте, Аноним, Вы писали:
А>DWORD WINAPI OnXXX(LPVOID ptr) А>{ А> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем.
Здравствуйте, sc, Вы писали:
sc>Здравствуйте, Аноним, Вы писали:
А>>DWORD WINAPI OnXXX(LPVOID ptr) А>>{ А>> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А>> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. sc>
<skiped>
sc>Может быть сделать проверку? sc>
CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd();
sc>if(NULL != ftr && ::IsWindow(ftr->m_hWnd)
sc>{
sc> //работаем дальше
sc> int count=ftr->m_log.GetCount();
sc>}
m_log какой тип имеет? CComboBox? Нельзя вызывать эту функцию из другого потока. НЕЛЬЗЯ!
Re[3]: Проблема с указателем
От:
Аноним
Дата:
18.07.05 08:10
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, sc, Вы писали:
sc>>Здравствуйте, Аноним, Вы писали:
А>>>DWORD WINAPI OnXXX(LPVOID ptr) А>>>{ А>>> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А>>> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. sc>>
<skiped>
sc>>Может быть сделать проверку? sc>>
CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd();
sc>>if(NULL != ftr && ::IsWindow(ftr->m_hWnd)
sc>>{
sc>> //работаем дальше
sc>> int count=ftr->m_log.GetCount();
sc>>}
LM>m_log какой тип имеет? CComboBox? Нельзя вызывать эту функцию из другого потока. НЕЛЬЗЯ!
m_log ето СListBox но тут чтото другой я уже месяц голову ломаю вылет происходит в строчках где используется указатель ftr по очередно коментировал спрочки и каждый раз был вылет на селдуюшей строчке.
может быть в диалоге CBISBackuperDlg определить переменную int m_LogCount и в самом диалоге на WM_CLOSE или WM_DESTROY выполнять m_LogCount = m_log.GetCount() ?
Соотвественно исходный код заменить на такой, например:
При создании потока передавай MainWnd в функцию потока параметром
Re[2]: Проблема с указателем
От:
Аноним
Дата:
19.07.05 05:57
Оценка:
Здравствуйте, orefkov, Вы писали:
O>При создании потока передавай MainWnd в функцию потока параметром
m_hWnd? я пробырал передватвать через параметр в функции LPVOID ptr потом преобразовую к m_hWnd.
Re[3]: Проблема с указателем
От:
Аноним
Дата:
19.07.05 06:17
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, orefkov, Вы писали:
O>>При создании потока передавай MainWnd в функцию потока параметром
А>m_hWnd? я пробырал передватвать через параметр в функции LPVOID ptr потом преобразовую к m_hWnd.
//
CreateThread(NULL,0,OnWorker,m_hWnd,0,0);
// вот проблемная функция
WORD WINAPI OnWorker(LPVOID ptr)
{
CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd();
int count=ftr->m_log.GetCount();
if(ftr->coutpath==0){
return 0;
}
for(int t=0;t<count;t++){ ftr->m_log.DeleteString(0);
} ftr->m_progress.SetPos(0);
for(int i=0;i<ftr->coutpath;i++){
if((ftr->CopyDirTree(ftr->arpath[i],ftr->arpath[i++]))==1){ // CopyDirTree(..) резервирует данные ftr->m_log.AddString(ftr->arpath[i]); // заполнение отчета ftr->m_log.AddString(ftr->arpath[i++]); // заполнение отчета ftr->Logger(ftr->arpath[i],ftr->arpath[i++]); // функция для заполения лога.
}
else {
CString sterout;
CString sterin;
sterout.Format("%s %s",ftr->arpath[i],"Неудачно");
sterin.Format("%s %s",ftr->arpath[i++],"Неудачно");
} ftr->m_progress.StepIt();
} ftr->m_progress.SetPos(0);
KillTimer(ftr->m_hWnd,69);
return 1;
}
// функция для заполения лога.
void CBISBackuperDlg::Logger(CString pathout,CString pathin)
{
fstream file;
file.open(fdate,ios::out|ios::binary|ios::app);
if(!file){
return;
}
file<<pathin;
file<<pathout;
file.close();
}
Как мне выйти из положение? Может есть какой то аналог потоков, но с возможностью использования MFC. Или можно както выйти из моего положения не уходя от даного потока.
Здравствуйте, Аноним, Вы писали:
А>DWORD WINAPI OnXXX(LPVOID ptr) А>{ А> CBISBackuperDlg *ftr=(CBISBackuperDlg*)AfxGetMainWnd(); А> int count=ftr->m_log.GetCount(); // ошбика вылитает ошибка закрытия программы проблема с указателем. А> ............... А>OnXXX это метод не класса CBISBackuperDlg указатель необходим для обращения к полям класса CBISBackuperDlg а также для вызовае его методов. Помогите!!! в других проектах таже самая ощибка.
Смотрим MSDN .....
If AfxGetMainWnd is called from the application's primary thread, it returns the application's main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associated with the thread that made the call.
.......
Для получения нужного объекта окна, функция AfxGetMainWnd() должна вызываться в основном потоке, и в порожденный поток нужно передавать указатель на объект окна через параметры потоковой функции.
Да и если приложение базируется на MFC, то лучше использовать AfxBeginThread и класс потока порожденный от CWinThread.