Проблема в потоке
у меня есть функция копирования файла, которая сначала вызывает модальный диалог, потом если в диалоге нажимаю ОК, то идет дальше по функции выполнение копирования
есть другая функция, общего вида, где просто вызывается первая функция копирования
и есть функция-поток, в которой вызывается та общая функция
фух...ну вообщем проблема в том, что опытным путем я разобрался что из того потока не хочет вызываться первая самая функция, т.е. в нее даже вход не происходит...
не знаю понял ли кто из моих слов суть проблемы :), но вот такие грабли...может кто знает в чем траблы ?
не знаю понял ли кто из моих слов суть проблемы :)
Не понял ;)
Покажи код
Не понял ;)
Покажи код
есть рекурсивная функция определения размера папки:
{
CFileFind find;
CStringArray dirs;
BOOL Ok = find.FindFile(my+"\\"+"*.*");
while(Ok)
{
Ok=find.FindNextFile();
if(find.IsDots())continue;
if(find.IsDirectory())
{
dirs.Add(find.GetFilePath()); }
else folsize+=find.GetLength();
}
for(int i=0;i<dirs.GetSize();i++)
{
CString ф;
a=dirs.GetAt(i);
GetFolSize(a);
}
find.Close();
}
есть функция, откуда предыдущая функция вызывается в цикле:
void CMyExplorerDlg::NewCopy(int FLAG)
{
...
GetFolSize(exp1->CurrentPath+"\\"+exp1->GetItemText(index,0));
...
}
и еще есть третья функция, функция нового потока:
UINT CopyFileMyTh(LPVOID lp)
{
CMyExplorerDlg *dlg=(CMyExplorerDlg *)lp;
dlg->NewCopy(FLAG_COPY);
return 0;
}
ну вот
и когда я создаю вот этот поток, вылетает ошибка
и что самое интересное, установил опытным путем что ошибку выдает именно при входе в функцию GetFolSize. Также я увидел что сам вход в функцию даже не выполняется....(ставил в начале функции мессаджбокс, который не появлялся)
Так вот я и думаю, что скорее всего проблема в том, что из функции потока мало того что вызывается другая функция, так и из той другой еще одна
Хотя по идее пусть их хоть 30 штук, этих функций будет, должно ведь работать....
вот так :)
1.
Проверь, что ты передаешь то, что тебе нужно.
Вроде:
CString tmp;
tmp = exp1->CurrentPath+"\\"+exp1->GetItemText(index,0)
Может у тебя фигня какя там вылазит.
2.
Я не уверен, что можно делать именно так. Проверь указатель. Может он никуда не указывает?
А вообще, странная у тебя организация программы. Обычно операции с файлами делаются в потоке. А ты, наоборот, из потока вызываешь функцию для файлов
есть рекурсивная функция определения размера папки:
есть функция, откуда предыдущая функция вызывается в цикле:
и еще есть третья функция, функция нового потока:
ну вот
и когда я создаю вот этот поток, вылетает ошибка
и что самое интересное, установил опытным путем что ошибку выдает именно при входе в функцию GetFolSize. Также я увидел что сам вход в функцию даже не выполняется....(ставил в начале функции мессаджбокс, который не появлялся)
Так вот я и думаю, что скорее всего проблема в том, что из функции потока мало того что вызывается другая функция, так и из той другой еще одна
Хотя по идее пусть их хоть 30 штук, этих функций будет, должно ведь работать....
вот так :)
void CMyExplorerDlg::GetFolSize(CString my)
{
CFileFind find;
CStringArray dirs;
BOOL Ok = find.FindFile(my+"\\"+"*.*");
while(Ok)
{
Ok=find.FindNextFile();
if(find.IsDots())continue;
if(find.IsDirectory())
{
dirs.Add(find.GetFilePath()); }
else folsize+=find.GetLength();
}
Хм. Я не совсем уверен - но на мой взгляд данная конструкция должна выглядеть так:
if(find.IsDirectory())
{
dirs.Add(find.GetFilePath);
}
else folsize+=find.GetLength();
for(int i=0;i<dirs.GetSize();i++)
{
CString ф;
a=dirs.GetAt(i);
GetFolSize(a);
}
Зачем так сложно? :)
Разве так не проще: GetFolSize(dirs.GetAt(i));?
Да и рекурсию ты не совсем правильно строишь. Зачем так много памяти кушать?
if(find.IsDirectory())
{
dirs.Add(find.GetFilePath);
}
else folsize+=find.GetLength();
Ведь это можно написать еще проще:
if(find.IsDirectory())
{
GetFolSize(find.GetFilePath);
}
else folsize+=find.GetLength();
Избыточный код в основном и создает ошибки.