Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

TThread и через CreateThread   Найти похожие ветки 

 
kaZaNoVa   (2004-08-21 09:53) [0]

Сабж :)
Уважаемые мастера, чем отличается юзание потоков через TThread и через CreateThread  ?


 
Sergey_Masloff   (2004-08-21 10:01) [1]

Вобщем-то ничем.


 
jack128 ©   (2004-08-21 11:49) [2]

Удобством..


 
вразлет ©   (2004-08-21 12:01) [3]

во дворе


 
y-soft ©   (2004-08-21 12:07) [4]

Смотря как создается поток с помощью CreateThread и как используется


 
DiamondShark ©   (2004-08-21 12:14) [5]

При создании потока с помощью класса TThread или функцией BeginThread устанавливается системный флаг IsMultithreaded, который влияет на работу менеджера памяти.


 
kaZaNoVa   (2004-08-21 12:50) [6]

То есть лучше TThread юзать ?
или проще CreateThread - и понятнее ..
- никаких execute......


 
Igorek ©   (2004-08-21 13:22) [7]


> DiamondShark ©   (21.08.04 12:14) [5]
> При создании потока с помощью класса TThread или функцией
> BeginThread устанавливается системный флаг IsMultithreaded,
> который влияет на работу менеджера памяти.

Да, действительно.

var IsMultiThread: Boolean;
Description
IsMultiThread is set to True by BeginThread in order to allow the memory manager to execute safely if a VCL application has more than one thread. If a second thread attempts to allocate memory, it is blocked until the first thread exits the memory manager.

Но вот еще вопрос. Я пишу щас на С++ Builder, юзаю CreateThread() из WinAPI. Все потоки юзают динамическое выделение памяти. Но в С++ это new/delete.
Правильно ли использовать в этом случае CreateThread() вместо BeginThread()? Последняя кстати доступна, как
extern PACKAGE int __fastcall BeginThread(void * SecurityAttributes, unsigned StackSize, TThreadFunc
ThreadFunc, void * Parameter, unsigned CreationFlags, unsigned &ThreadId);
в System.hpp

Понятно, что в Дельфи надо юзать BeginThread(). А вот в Билдере тот же менеджер памяти?


 
DiamondShark ©   (2004-08-21 13:40) [8]


> kaZaNoVa   (21.08.04 12:50) [6]
> То есть лучше TThread юзать ?
> или проще CreateThread - и понятнее ..
> - никаких execute......

BeginThread, если с классом не хочется заморачиваться.


 
DiamondShark ©   (2004-08-21 13:45) [9]


> IsMultiThread is set to True by BeginThread in order to
> allow the memory manager to execute safely if a VCL application
> has more than one thread. If a second thread attempts to
> allocate memory, it is blocked until the first thread exits
> the memory manager.

Кстати, пусть слова "VCL application" не вводят в заблуждение. Это касается ЛЮБОГО приложения. Например, работа со строками задействует менеджер памяти.


> Понятно, что в Дельфи надо юзать BeginThread(). А вот в
> Билдере тот же менеджер памяти?

А это важно?
Просто использовать BeginThread. Для единообразия.

Кстати, менеджер памяти точно такой же.


 
Igorek ©   (2004-08-21 13:46) [10]

И еще вопрос. Если юзать BeginThread, то получается, что не надо потом делать CloseHandle(). Т.е. поток автоматом закрывается по завершении работы ThreadFun?


 
Igorek ©   (2004-08-21 13:48) [11]


> по завершении работы ThreadFun?

:-) веселый поток...
ThreadFunc() имел ввиду


 
DiamondShark ©   (2004-08-21 13:50) [12]


> И еще вопрос. Если юзать BeginThread, то получается, что
> не надо потом делать CloseHandle().

Это ещё почему? BeginThread возвращает хэндл потока, точно так же как и CreateThread.

function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
 ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
 var ThreadId: LongWord): Integer;
var
 P: PThreadRec;
begin
 New(P);
 P.Func := ThreadFunc;
 P.Parameter := Parameter;
 IsMultiThread := TRUE;
 Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
   CreationFlags, ThreadID);
end;


 
Igorek ©   (2004-08-21 15:40) [13]


> DiamondShark ©   (21.08.04 13:50) [12]
> Это ещё почему? BeginThread возвращает хэндл потока, точно
> так же как и CreateThread.

Ты конечно прав. Для Дельфи все просто. А вот в Билдере есть грабли.
С одной стороны:

> extern PACKAGE int __fastcall BeginThread(
- System.hpp
С другой:

CloseHandle(HANDLE hObject);
- winbase.h
и

typedef void *PVOID;
typedef PVOID HANDLE;
- winnt.h

И просто написать нельзя:

int hThread2 = BeginThread(...);
...
CloseHandle(hThread2);//[C++ Error] E2034 Cannot convert "int" to "void *"

Надо наверно или приводить:
CloseHandle((void*)hThread2);

Или юзать все таки CreateThread/CloseHandle и самому писать
IsMultiThread = true;. Или полностью сдублировать BeginThread().

Настораживают оба варианта.
Хотя мы и знаем, что Pointer в Дельфи по размеру одинаков с Integer, а в С++ sizeof(int) = (sizeof(void*), но все равно строгая типизация заставляет задуматься - где что не так.

Ну а ручное выставление IsMultiThread тоже не нравиться. В хелпе Билдера этой переменной нету, значит нельзя ее юзать, хотя возможно.


 
Mystic ©   (2004-08-21 16:14) [14]

CreateThread я не рекомендую пользоваться. Есть обвертка BeginThread которой и надо пользоваться... Все остальное от лукавого, потому как у меня просто стойка на CreateThread, ведь установка IsMultihtread может быть абсолютно в другом месте. И ты начинаешь ловить этот баг...

А TThread или BeginThread это уже зависит от задачи. Я, например, если поток должен отработать и умереть самостоятельно использую BeginThread, а если он крутится в цикле и ожидает команды своей остановки извне + должен что-то рисовать, то TThread. В каждом конкретном случае конкретный ответ.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
4-1091311946
BaG
2004-08-01 02:12
2004.09.12
Автоматическое включение компьютера


14-1093262735
SPeller
2004-08-23 16:05
2004.09.12
Сеть


10-1037617973
Comwad
2002-11-18 14:12
2004.09.12
Почему неуклонно растет память приложений клиента и сервера в D7?


4-1091094354
Егор_С
2004-07-29 13:45
2004.09.12
Появление формы поверх всех приложений


1-1093035441
ИМХО
2004-08-21 00:57
2004.09.12
The specified module could not be found.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский