Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Frodo_Torbins Спасибо. Вообще интересный блог. Перевел на строки возврат функции и все заработало, да и со строками проще работать. У меня ко всем вопрос кто разбирается хорошо в теме. Собственно приведу небольшой пример. Есть последовательность действий, выполняемая в отдельном потоке. Естественно поток нужен только лишь для того, чтобы не стопорить интерфейс приложения во время длительного действия. Этот поток должен быть всегда один и нужны проверки дабы не создавать вторичные потоки по глупости. Например, длительный расчет чего-то там, но с возможностью прервать действие. Сделано сейчас так: Глобальные переменные terminate: Boolean = TRUE и thread: DWORD = 0. Имеется структура для передачи этому потоку. Код: type TThreadParams = packed record Handle : THandle; pszAnsi: AnsiString; end; PThreadParams = ^TThreadParams; | В колбэке для создания потока сделано так: Код: function ThreadCallback(LpParameter: PThreadParams): DWORD; stdcall; begin // Result := 0; // SetThreadPriority(thread, THREAD_PRIORITY_LOWEST); // repeat расчет Sleep(5); until (переменная > значение) or terminate // Dispose(LpParameter); end; | Есть 3 кнопки пуск, стоп и прервать, ну типа того. Теперь надо бы организовать проверки. Код кнопки пуск: Код: if terminate then terminate := FALSE; if ((thread = 0) and (not terminate)) then begin New(params); // локальная переменная. params.Handle := hWnd; params.pszAnsi := 'data'; thread := CreateThread( nil, 0, @ThreadCallback, params, 0, ThreadID ); if (thread <> 0) then begin CloseHandle(thread); thread := 0; end; | Код кнопки стоп: Код: terminate := TRUE; if (thread <> 0) then begin GetExitCodeThread(thread, dwRet); TerminateThread(thread, dwRet); CloseHandle(thread); thread := 0; end; | Ну и код кнопки прервать это просто terminate в TRUE устанавливаю. Если тыкать на пуск во время выполнения длительного колбэка, то создаются новые потоки, текущий не уничтожается, вероятно не успевает завершиться или не доходит до кода где Dispose. Может надо критические секции использовать или через WaitForSingleObject действовать? Информации по потокам масса, но ее так много, что я не в состоянии корректно переварить все. Везде масса вариантов и везде как мне кажется есть небольшие косяки. Ну и рекомендации с BeginThread раз в Делфи работаю. Но мне не надо ее. Как корректнее завершить поток и выполнить проверку? |