Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-45546
elektro
2002-09-18 16:54
2002.10.14
Upgrade компьютера.


1-45249
Петя
2002-10-04 10:43
2002.10.14
Расшифруйте пожалуйста


3-45218
Weare
2002-09-23 12:43
2002.10.14
Копирование и вставка


6-45492
BlackSun
2002-08-12 12:57
2002.10.14
Отправка данных из ServerSocket


14-45525
Ученик
2002-09-19 08:45
2002.10.14
Консерватизм в программировании (выбор средств, методы)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский