Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать, что TThread отработал 
V
    Опции темы
MadCoder
Дата 6.7.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Не работает smile 
PM WWW ICQ   Вверх
Rrader
  Дата 6.7.2008, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;  

var
  Form1: TForm1;
  A: Integer = 0;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  Sleep(50);
  InterlockedIncrement(A);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Handles: array [1..MAXIMUM_WAIT_OBJECTS] of THandle;
  I: Integer;
begin
  A := 0;
  for I := Low(Handles) to High(Handles) do
    with TMyThread.Create(False) do
    begin
      Handles[I] := Handle;
      { Лучше заменить на массив потоков }  
      //FreeOnTerminate := True;
    end;
  if WaitForMultipleObjects(High(Handles),
    @Handles, True, INFINITE) = WAIT_OBJECT_0 then ShowMessage(IntToStr(A));
  ShowMessage(SysErrorMessage(GetLastError));
end;

end.

Цитата(MSDN)

WaitForMultipleObjects
Parameters
nCount
Specifies the number of object handles to wait for in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS. 


Однако данная функция очень удобна и атомарна в своих действиях, поэтому я бы сделал несколько серий ожиданий.

Это сообщение отредактировал(а) Rrader - 10.7.2008, 16:49


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
MadCoder
Дата 8.7.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Сделал копи-паст полный, скомпилировал, запускаю, пишет: "Параметр задан неверно" и "Неверный дескриптор".

Это сообщение отредактировал(а) MadCoder - 8.7.2008, 14:26
PM WWW ICQ   Вверх
Rennigth
Дата 8.7.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



MadCoder, 
Успевали первые треды завершиться до вызова W@aitForMultipleObjects.
Если переделать примерно так, то работает.
Код

unit Unit34;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm34 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  Form34: TForm34;
  A: Integer = 0;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  Sleep(50);
  InterlockedIncrement(A);
  Sleep(1000);
end;

procedure TForm34.btn1Click(Sender: TObject);
var
  Handles: array [1..MAXIMUM_WAIT_OBJECTS] of THandle;
  I: Integer;
  WaitRes: Cardinal;
begin
  SetLastError(NO_ERROR);
  A := 0;
  for I := Low(Handles) to High(Handles) do
    with TMyThread.Create(True) do
    begin
      Handles[I] := Handle;
      Resume;
      FreeOnTerminate := True;
    end;
  WaitRes := WaitForMultipleObjects(High(Handles),
    @Handles, True, INFINITE);
  if WaitRes = WAIT_OBJECT_0 then
    ShowMessage(IntToStr(A))
  else
    ShowMessage(SysErrorMessage(GetLastError));
end;

end.




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rrader
  Дата 8.7.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Ага, нашел ошибку. Из-за FreeOnTerminate  smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
MadCoder
Дата 8.7.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Спасибо, супер smile 
PM WWW ICQ   Вверх
Rrader
  Дата 8.7.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



MadCoder, в таком случае, чтобы без FreeOnTerminate работать, заведи еще и массив потоков. Создавай их так же, но в конце удаляй (Free). Иначе получаешь утечку памяти...неслабую


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.