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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2012, 15:05   #1
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию ConsoleApplication+Thread

Здраствуйте многоуважаемые! Есть некий код:
Код:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,Classes;

type
  TMyThread = class(TThread)
  protected
    procedure DoSome;
    procedure Execute; override;
  public
    Offset : Word;
  end;

var
  Threads : array [0..2] of TMyThread;

procedure TMyThread.DoSome;
begin
  Writeln('This is '+Inttostr(Offset)+' thread');
end;

procedure TMyThread.Execute;
begin
  DoSome;
end;

procedure ThreadInit(const Offset : Word);
begin
  Threads[Offset] := TMyThread.Create(true);
  Threads[Offset].FreeOnTerminate := true;
  Threads[Offset].Offset := Offset;
  Threads[Offset].Start;
end;

begin
  ThreadInit(0);
  ThreadInit(1);
  ThreadInit(2);
  Readln;
end.
Так вот - если оставить так (без Synchronize) то пишет все норм, но иногда происходят сбои (то один поток 2 раза Writeln выполнит, то еше что то). Я логично понимаю что надо вместе с синхронизация, но когда пишу
Код:
Synchronize(DoSome)
то DoSome вообще не выполняется. Не первый раз такое замечаю и именно в ConsoleApp.
RuVarez вне форума Ответить с цитированием
Старый 05.04.2012, 15:45   #2
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Люди ну хоть что то скажите
RuVarez вне форума Ответить с цитированием
Старый 05.04.2012, 16:09   #3
error404ru
 
Регистрация: 04.04.2012
Сообщений: 4
По умолчанию

на WinAPI куда проще
Код:
uses
  Windows

type
  TMyThread = record
    hThread: THandle;
    idThread: Cardinal;
  end;

var
  Threads : array [0..2] of TMyThread;

procedure DoSome;
begin
  Writeln('This is '+Inttostr(Offset)+' thread');
  Sleep(600);
end;

procedure ThreadInit(const Offset : Word);
begin
  Threads[Offset].hThread := CreateThread(nil, 0, @DoSome, nil, 0, Threads[Offset].idThread);
end;

procedure ThreadClose(const Offset : Word);
var
  iExitCode: Cardinal;
begin
  GetExitCodeThread(hThread[Offset].hThread, iExitCode);
  TerminateThread(hThread[Offset].hThread, iExitCode);
  CloseHandle(hThread[Offset].hThread);
end;

begin
  ThreadInit(0);
  ThreadInit(1);
  ThreadInit(2);
  Readln;
end.
error404ru вне форума Ответить с цитированием
Старый 05.04.2012, 16:20   #4
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Проще нен значет лучше! Меня интересует именно вариант с наследником TThread.
RuVarez вне форума Ответить с цитированием
Старый 05.04.2012, 18:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я логично понимаю что надо вместе с синхронизация
Зачем? Синхронизация хороша если в потоке цикл отрабатывает, а у тебя чисто оператор выполнился и поток закрылся. Какая тут синхронизация? Нечего синхронизировать толком.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.04.2012, 18:19   #6
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Ну а без синхронизации потоки идут мало того что в случайном порядке так еше одит и тот же поток может выполнить метод DoSome два раза, а некоторые потоки вообще не выполняет его! Вот такой вот хаос)
RuVarez вне форума Ответить с цитированием
Старый 07.04.2012, 10:25   #7
RinatV
Пользователь
 
Регистрация: 06.07.2009
Сообщений: 27
По умолчанию

Код:
  ThreadInit(0);
  ThreadInit(1);
  ThreadInit(2);
  while GetAsyncKeyState(VK_RETURN)=0 do CheckSynchronize;
получается что потоки синхронизируются с главным потоком, а соответсвенно както должны прерывать его работу.
RinatV вне форума Ответить с цитированием
Старый 07.04.2012, 15:42   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Вот так будет работать:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

type
  TMyThread = class(TThread)
  protected
    FOffset : Word;
    procedure DoSome;
    procedure Execute; override;
  end;

var
  i : Integer;
  Threads : array [0..2] of TMyThread;

procedure TMyThread.DoSome;
begin
  Writeln('This is '+Inttostr(FOffset)+' thread');
end;

procedure TMyThread.Execute;
begin
  DoSome;
end;

procedure ThreadInit(const AOffset : Word);
begin
  Threads[AOffset] := TMyThread.Create(true);
  Threads[AOffset].FreeOnTerminate := False;
  Threads[AOffset].FOffset := AOffset;
  Threads[AOffset].Start;
end;

begin
  ThreadInit(0);
  Threads[0].WaitFor;
  ThreadInit(1);
  Threads[1].WaitFor;
  ThreadInit(2);
  Threads[2].WaitFor;
  Readln;
  for i:=0 to High(Threads) do FreeAndNil(Threads[i]);
end.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Thread и MVC OnlyFart ASP.NET 0 06.05.2011 11:12
ClientSocket и ConsoleApplication FanRa3 Работа с сетью в Delphi 1 08.01.2011 18:11
Thread в Windows From Application Flay Windows Forms 7 24.08.2010 21:28
Thread Cpluser Общие вопросы .NET 6 30.03.2010 23:32
Проблема с Thread Arnezami Общие вопросы .NET 2 04.10.2009 22:08