Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема в потоке

2.0K
26 мая 2004 года
Androth
54 / / 07.03.2004
Ситуация вот как выглядит:
у меня есть функция копирования файла, которая сначала вызывает модальный диалог, потом если в диалоге нажимаю ОК, то идет дальше по функции выполнение копирования
есть другая функция, общего вида, где просто вызывается первая функция копирования
и есть функция-поток, в которой вызывается та общая функция
фух...ну вообщем проблема в том, что опытным путем я разобрался что из того потока не хочет вызываться первая самая функция, т.е. в нее даже вход не происходит...
не знаю понял ли кто из моих слов суть проблемы :), но вот такие грабли...может кто знает в чем траблы ?
2.1K
26 мая 2004 года
cozy
69 / / 11.01.2004
Цитата:
Originally posted by Androth

не знаю понял ли кто из моих слов суть проблемы :)



Не понял ;)
Покажи код

2.0K
26 мая 2004 года
Androth
54 / / 07.03.2004
Цитата:
Originally posted by cozy


Не понял ;)
Покажи код


есть рекурсивная функция определения размера папки:

Цитата:
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();
}
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 штук, этих функций будет, должно ведь работать....
вот так :)

2.1K
27 мая 2004 года
cozy
69 / / 11.01.2004
Я думаю, что в твоем коде есть два потенциально опасных места:

1.
 
Код:
GetFolSize(exp1->CurrentPath+"\\"+exp1->GetItemText(index,0));

Проверь, что ты передаешь то, что тебе нужно.
Вроде:
CString tmp;
tmp = exp1->CurrentPath+"\\"+exp1->GetItemText(index,0)

Может у тебя фигня какя там вылазит.

2.
 
Код:
CMyExplorerDlg *dlg=(CMyExplorerDlg *)lp;

Я не уверен, что можно делать именно так. Проверь указатель. Может он никуда не указывает?

А вообще, странная у тебя организация программы. Обычно операции с файлами делаются в потоке. А ты, наоборот, из потока вызываешь функцию для файлов
487
07 июня 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Androth

есть рекурсивная функция определения размера папки:

есть функция, откуда предыдущая функция вызывается в цикле:

и еще есть третья функция, функция нового потока:

ну вот
и когда я создаю вот этот поток, вылетает ошибка
и что самое интересное, установил опытным путем что ошибку выдает именно при входе в функцию 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();

Избыточный код в основном и создает ошибки.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог