Форум: "WinAPI";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизВопрос о BeginThread Найти похожие ветки
← →
AntonV (2002-09-01 10:06) [0]Уважаемые программисты! Подскажите, как грамотно вызвать завершение функции BeginThread при помощи EndThread. И хотелось бы узнать по подробнее о передаваемых в них параметрах.
← →
Набережных С. (2002-09-01 19:46) [1]Очень просто - если хоть чуть-чуть заглянуть в исходники. А если что-то не получается, то - карты на стол. В смысле - код в студию.
← →
AntonV (2002-09-02 09:17) [2]Сущность такова. Существует главная форма MainForm, из меню которой в отдельной нити запускается форма SuplmForm. А вот тексты модулей:
***************************************************************
unit MainPart; //MainForm
uses ... SupplementaryPart ;
Var
ThreadHandle,ThreadId:Cardinal; //глобальные переменные
implementation
Procedure ShowForm;
Begin
SuplmForm.ShowModal;
End;
procedure TMainForm.N7Click(Sender: TObject);
begin
ThreadHandle:=BeginThread(nil,1024,@ShowForm,nil,0,ThreadId);
end;
***************************************************************
unit SupplementaryPart;//SuplmForm
uses ... MainPart ;
implementation
procedure TSuplmForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TerminateThread(ThreadHandle,0);
end;
***************************************************************
Если же при закрытии SuplmForm не вызыватьTerminateThread,
то просто ничего не происходит, а вызов функции вызывает "зависание" SuplmForm. :(((
← →
Алексанр Спелицин (2002-09-02 13:29) [3]К сожалению, Вам придется пересмотреть чуть ли не всю концепцию Вашего проекта. Итак,
1. Код VCL не является потокобезопасным. Об этом говорилось не раз, причем не только здесь. Даже Borland-у пришлось это признать и ввести TThread.Synchronize. (См. ее описание в Help). А Вы пытаетесь использовать в потоках формы (TForm)!!!
2. Поток существует, пока управление находится в теле функции потока. Т.е. как только эта функция завершается, то и поток завершается вместе с ней. Немедленно! А Вы в теле этой функции создаете форму и тутже функция завершается.
3. В отдельном потоке Вы ИМЕННО создаете форму. И только!!! А дальнейшая жизнь ее будет проходить в основном потоке программы. Скорее всего Вы хотели чего-то другого.
4. Если же Вы Действительно хотите, чтобы форма жила в отдельном потоке, то тут вынужден вас огорчить. Вам придется писать код на чистом Win32 API. Либо использовать другую библиотеку, возможно с переходом на другой язык и систему разработки, например MFC и Visual C++.
5. Но в любом случае, программирование потоков пользовательского интерфейса значительно сложнее и требует больш ого опыта в программировании обычных рабочих потоков. А Вы, по моему скромному мнению, не работали не с первыми, ни со вторыми.
И напоследок, мой Вам совет. Учиться программированию потоков (также как и других элементов Win32 Api) лучше всего с использованием функций Win32 API и по родным текстам из MSDN. Любые библиотеки это всего лишь обертка этих функций в классы и методы. Причем, не всегда корректная (обертка). Так в случае с потоками, в TThread я обнаружил 2 ошибки/неточности (на мой взгляд).
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c