Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2012, 13:18   #1
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Вопрос Потоки

Чем отличаются и что лучше ?

idThread[i]:=CreateThread(nil, 0, @procedure1, nil, 0, idThread);
Слышал то что CreateThread жрет сильно ресурсы а beginthread нет !

idThread[i]:=beginthread(nil, 0, @procedure1, nil, 0, idThread);
fucil вне форума Ответить с цитированием
Старый 24.05.2012, 14:56   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

BeginThread оборачивает API-функцию CreateThread (можно посмотреть в модуле System) и надо пользоваться ею.
Цитата:
Сообщение от CodeGear Delphi Runtime Library;
Код:
{$IFDEF MSWINDOWS}
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: LongWord): Integer;
var
  P: PThreadRec;
begin
  if Assigned(SystemThreadFuncProc) then
    P := PThreadRec(SystemThreadFuncProc(ThreadFunc, Parameter))
  else
  begin
    New(P);
    P.Func := ThreadFunc;
    P.Parameter := Parameter;
  end;
  IsMultiThread := TRUE;
  Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
    CreationFlags, ThreadID);
end;
При прямом вызове надо самостоятельно ловить ошибки, утечки, протечки и прочии неприятности.
eoln вне форума Ответить с цитированием
Старый 24.05.2012, 15:21   #3
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Вопрос Чем ?

и надо пользоваться ею ??? чем beginthread или CreateThread.

На данный момент я делаю так:
Правильно ли ???? поправьте если что не так !

Код:
var
Threads:array [0..50] of Cardinal;
idThread :Cardinal;
stop:boolean;

procedure ShowContent;
begin
while stop do 
  begin
    memo1.lines.add('Content: '+inttostr(random(1000)));
  end;
EndThread(0);
end;

procedure TFrmMAin.BtnStartClick(Sender: TObject);
begin
  stop:=True;
  for I := 0 to 10 do
  Threads[i]:= beginthread(nil, 0, @ShowContent, nil, 0, idThread);
end;

procedure TFrmMAin.BtnStopClick(Sender: TObject);
begin
  stop:=false;
  for I := 0 to 10 do
  CloseHandle(Threads[i]);
  //SuspendThread(Threads[i]);
end;

Последний раз редактировалось fucil; 24.05.2012 в 15:24.
fucil вне форума Ответить с цитированием
Старый 24.05.2012, 15:50   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

beginthread
CloseHandle может выполнится раньше, чем потоки отработают

И ещё синхронизации нет. И вообще лучше TThread, больше возможностей, да и с vcl хорошо работает

Последний раз редактировалось eoln; 24.05.2012 в 15:59.
eoln вне форума Ответить с цитированием
Старый 24.05.2012, 15:52   #5
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию !!!!!!

Код:
// так не работает
procedure TFrmMAin.BtnStopClick(Sender: TObject);
begin
  stop:=false;
  for I := 0 to 10 do
  CloseHandle(Threads[i]);
  //SuspendThread(Threads[i]);
end;

// а так работает ))
procedure TFrmMAin.BtnStopClick(Sender: TObject);
begin
  stop:=false;
  for I := 0 to 10 do
  //CloseHandle(Threads[i]);
  SuspendThread(Threads[i]);
end;
fucil вне форума Ответить с цитированием
Старый 24.05.2012, 16:08   #6
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию Это пример

Цитата:
Сообщение от eoln Посмотреть сообщение
beginthread
CloseHandle может выполнится раньше, чем потоки отработают

И ещё синхронизации нет. И вообще лучше TThread, больше возможностей, да и с vcl хорошо работает
Это просто пример, вообще у меня консольное приложение !
И синхронизация мне тут вообще ничему, тут нечего синхронизить !

По 3 посту полного ответа так и не получил !
Жду советов !

Последний раз редактировалось fucil; 24.05.2012 в 18:57.
fucil вне форума Ответить с цитированием
Старый 25.05.2012, 07:26   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от fucil Посмотреть сообщение
По 3 посту полного ответа так и не получил !
Жду советов !
Тыц.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.05.2012, 15:47   #8
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию )-:

я же не прошу готовый код, а я написал пример и хотел получить советов что у меня не так и как лучше ! а вы меня на гугл, я там читал и написал данный пример и ждал ваших советов по этому коду, кароче все ясно спс ! Хотя от GunSmoker не ждал такого ответа, обычно он дает хорошые ссылки или рекомендации (( увы !

Последний раз редактировалось fucil; 25.05.2012 в 16:04.
fucil вне форума Ответить с цитированием
Старый 25.05.2012, 22:22   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

GunSmoker даёт развёрнутые ответы на проблемы, а не на одну секунду в поиске.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки Killer_Pooh Общие вопросы Delphi 4 01.06.2011 02:28
[C#] Потоки Lemo C# (си шарп) 2 24.05.2011 21:50
Потоки. FieStik Общие вопросы C/C++ 4 23.05.2011 14:12
Потоки Aleksey1989 Помощь студентам 2 27.10.2010 10:07
потоки Владимир1988 Помощь студентам 0 08.02.2010 23:12