Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Результат выполнения функции потока  (Прочитано 13779 раз)
0 Пользователей и 1 Гость смотрят эту тему.
djan
Гость
« : 21-02-2007 23:01 » 

Есть диалоговое окно с кнопочкой, в которой примерно такой код:
Код:
HANDLE hThead=NULL;
ULONG ThreadId=0;
....

void CTestDlg::OnButton1()
{
int flag=1;
.....
hThead=CreateThread( NULL, 0,&MyTherdFunc, (void)flag, 0,&ThreadId);

}
Функция потока:
Код:
DWORD WINAPI CTestDlg::MyTherdFunc(LPVOID lParam) // объявлена как static
{
  // куча всяких вычислений
  if(Someflag)
  {
    return 1;
  }

  return 0;
}

Как узнать что результат выполенния потока (1 или 0)??

Пишу на VS 6.0
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 22-02-2007 01:32 » 

В таком виде - никак. Это не результат выполнения потока, а результат выполнения ф-ции, которая работает в треде.

Тут сходу на ум приходят два решения.

1. Сохранять результат во внешнюю переменную, которую опрашивать по окончании треда.

2. Использовать действительно код завершения треда:
а) сохранять хэндл треда - hThead например сделать мембер диалога, ну можно и глобально оставить.
б) завершать тред ф-ей ExitThread(нужный тебе код)
с) опрашивать код завершения треда:
BOOL WINAPI GetExitCodeThread( HANDLE hThread,  LPDWORD lpExitCode);

зы кстати во втором способе можно также передавать код и в TerminateThread
« Последнее редактирование: 22-02-2007 01:35 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 22-02-2007 08:32 » 

Насколько я знаю не обязательно явно вызвать ExitThread что бы сказать результат выполнения потока
достаточно, что бы MyTherdFunc возвращала DWORD, возвращенное значение не явно используется в ExitThread

так что достаточно сделать return а затем прочитать результат через GetExitCodeThread

Цитата
The thread execution begins at the function specified by the lpStartAddress parameter. If this function returns, the DWORD return value is used to terminate the thread in an implicit call to the ExitThread function. Use the GetExitCodeThread function to get the thread's return value.
« Последнее редактирование: 15-12-2007 16:17 от Алексей1153++ » Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 22-02-2007 09:22 » 

LogRus, точно, GetExitCodeThread ловит и её тоже. А я не знал. Жаль Век живи, век учись, дураком помрёшь. Иногда всё-таки полезно в MSDN заглядывать, даже насчёт тех вещей, про которые думаешь, что всё знаешь.

Цитата: MSDN
Remarks

If the thread has terminated and the function succeeds, the termination status returned may be one of the following:

    * The exit value specified in the ExitThread or TerminateThread function.
    * The return value from the thread function.
    * The exit value of the thread's process.
« Последнее редактирование: 15-12-2007 16:17 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
djan
Гость
« Ответ #4 : 22-02-2007 10:07 » 

Цитата
Насколько я знаю не обязательно явно вызвать ExitThread что бы сказать результат выполнения потока
достаточно, что бы MyTherdFunc возвращала DWORD, возвращенное значение не явно используется в ExitThread

Поток принудительно завершать нельзя, он должен выполнить некоторые вычисления и вернуть результат. Где в коде можно увидить результат работы функции потока (примерно как в VS d Debug - "The thread 0x264 has exited with code 0 (0x0)") или когда вызывать GetExitCodeThread()?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 22-02-2007 10:57 » 

djan, Для этого надо побольше знать концепцию твоего задания. Можно ожидать окончание треда, можно вызывать ф-ю GetExitCodeThread, если тред не кончился ответ будет STILL_ACTIVE

А ввобще теорию в MSDN почитать полезно.
http://msdn2.microsoft.com/en-us/library/ms683190.aspx
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
djan
Гость
« Ответ #6 : 22-02-2007 12:55 » 

У меня есть форма, в которой находится пргрецсбари кнопочка. По нажатию на кнопочку должен происходить коннект к серверу, который может по времени занимать от 2-3 сек до 1.5 мин и происходит не всегда с первого раза (OpenChannel() - функции из чужой dll). При вызове функции OpenChannel() в классе окно висит все это время. Поэтому перенес вызов функции OpenChannel() в отдельный поток. Мне необходимо каким-нибудь образом передать в класс результат работы OpenChannel(), для изменения прогресбара и вывода сообщений, типа конект успешный или нет
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 22-02-2007 13:10 » 

Я бы в этом случае передал в тред-функцию указатель на диалог (4й параметр в ф-ции CreateThread) и оттуда вызывал бы необходимые ф-ции. Например для прогресса. Таким же образом можно сообщить диалогу о завершении треда.
Иначе тебе надо будет организвывать следящие циклы. А как с прогресом быть вобще не знаю. Ведь тебе надо его изменять всё время.

ИМХО, самое "чистое" и простое - указатель в ф-ю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
djan
Гость
« Ответ #8 : 22-02-2007 15:34 » 

Надо было передавать в ф-ю еще один параметр - число. В классе объявил указатель который инициализирую значением this, а через него получаю доступ ко всем членам класа.

Всем спасибо))
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 22-02-2007 15:40 » new

Не понял В смысле "надо было"?

Это же то, что я тебе сказал.

Объявлять указатель не надо. Можно сразу передавать this в ф-ю:

hThead=CreateThread( NULL, 0,&MyTherdFunc, (void)flag, this, &ThreadId);

ps Да и про синхронизацию тредов не забывай. Самое простое - критические секиции.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines