Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
14-1093464569
NailMan
2004-08-26 00:09
2004.09.12
Генератор имен


3-1092832268
Slash
2004-08-18 16:31
2004.09.12
Путь к базе данных


14-1092738529
saNat
2004-08-17 14:28
2004.09.12
Программирование COM порта


3-1092377779
erden
2004-08-13 10:16
2004.09.12
как вытащить текст хранимой процедуры ...


1-1093526186
kj
2004-08-26 17:16
2004.09.12
Динамический массив.