Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Асинхронный или синхронный запуск


Автор: eXa 15.8.2007, 18:54
Возможно ли запустить ниже приведенный код асинхронно, а что ещё лучше синхронно. Без использования класса TThread и вообще потоков, а как множество отдельных программ взаимодействующих с главнной потоком(формой)  Если да, то как?

Код

type
  TMForm = class(TForm)
    Memo1: TMemo;
    btnStart: TButton;
    procedure btnStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Customer = class(TObject)
  procedure StartT;
  end;

var
  MForm: TMForm;
  Customer: TList;
implementation

{$R *.dfm}

procedure SubDelay(Time: Cardinal);
 var
   Ticks: Cardinal;
 begin
   Ticks:= GetTickCount;
   while GetTickCount - Ticks < Time do
   begin
     SleepEx(50, True);
     Application.ProcessMessages
   end;
 end;


procedure TMForm.btnStartClick(Sender: TObject);
var
TH:array[0..9] of Customer;
A: integer;
begin
for A:= 1 to 3 do
 begin
   TH[A].StartT;
 end;
end;

procedure Customer.StartT;
var
B,C: integer;
begin
B:= 0;
for C:= 1 to 3 do
 begin
   B:= B+1;
   MForm.Memo1.Lines.Add(inttostr(B));
   SubDelay(1000);
  end;
 end;


Вот что программа выводит, время выполнения 9 секнуд
Код

1
2
3
1
2
3
1
2
3
 

а надо, время выполнения 3 секунды

Код

1
1
1
2
2
2
3
3
3






Автор: dumb 15.8.2007, 19:48
Цитата(eXa @  15.8.2007,  18:54 Найти цитируемый пост)
Возможно ли запустить ниже приведенный код асинхронно, а что ещё лучше синхронно.
зачем использовать слова, смысл которых ты не понимаешь?

Цитата(eXa @  15.8.2007,  18:54 Найти цитируемый пост)
Без использования класса TThread и вообще потоков, а как множество отдельных программ взаимодействующих с главнной потоком(формой)  Если да, то как?
нет, никак.
есть, конечно, такое слово как fiber, но это еще веселее, чем потоки, так что... разбирайся с потоками.

Автор: eXa 15.8.2007, 20:13
Цитата

зачем использовать слова, смысл которых ты не понимаешь?

хм... синхронно - одновременно, асинхронно по порядку, в разнобой... Разве что то не так? O_o

Цитата

нет, никак.
есть, конечно, такое слово как fiber, но это еще веселее, чем потоки, так что... разбирайся с потоками.


С патоками небыло вапросов, но с ними нельзя, ну может всётки наколдует кто нибудь мне эти чудестные строчки над каторыми я уже бюсь около недели smile  Совсем замучился... Знаю что для асинхроного запуска, используют TList.  

Автор: ALeXandrK 15.8.2007, 20:51
А что ты тут вообще собрался выполнять синхронно/асинхронно? У тебя же не несколько методов, а всего один.
Поясни что я тут не понял...

И потом ты в процедуре  SubDelay запускаешь Application.ProcessMessages, что ведет к неопределенным задержкам - 
ну кто знает сколько там будут обрабатываться незнамо какие сообщения?

Есть спец средства, которые позволяют определять сколько выполняется по времени тот или
иной участок кода. Ты бы прогнал посмотрел - что у тебя затягивает процесс, но для начала убери Application.ProcessMessages может тебе это даст прирост во времени.

P.s.: может смысл слов синхронно/асинхронно ты и понимаешь, но как все это дело завязанно с компьютером ты видишь с трудом.


Автор: eXa 16.8.2007, 02:48
Допустим у меня есть однопоточная программа, я делаю n'ое количество её экземпляров и "скармливаю" ей через форму разные данные для обработки, метод их обработки ессно один. Вот что мне требуется только в атоматизированом варианте.Ну а SubDelay обычный таймер, каторый можно заменить sleep'ом что лучше не будет, можно конешно воспользоваться сторонними таймерами... Вообщем это процедура не важна.

Автор: aktuba 16.8.2007, 04:38
Цитата

есть однопоточная программа, я делаю n'ое количество её экземпляров


Это и есть потоки.  smile 

Объясни нормально, что ты хочешь в итоге получить.

Автор: eXa 16.8.2007, 18:16
Я объяснил вполне даходчиво что мне надо

Автор: aktuba 16.8.2007, 19:03
Цитата

Я объяснил вполне даходчиво что мне надо 


Да нет... Например
Код

1
1
1
2
2
2
3
3
3


С помощью потоков или отдельных файлов никак не сделаешь, т.к. необходимо отслеживать действие каждого из поток/файлов и вовремя(!!!) приостанавливать/продолжать действие каждого потока/файла. Иначе не угадаешь у какого потока/файла процедура сработает раньше/позже. А кроме этого отдельное приложение вообще может вылететь с ошибкой, зависнуть и т.д. Что в этом случае делать остальным экземплярам?

Автор: eXa 16.8.2007, 19:39
Цитата

А кроме этого отдельное приложение вообще может вылететь с ошибкой, зависнуть и т.д. Что в этом случае делать остальным экземплярам?

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

-------------------------------------

Вот помагли с кодесами, но вот незадача, в  Application.ProcessMessages вызванный из SubDelay должен был сгенерировать переход к TMForm.WMMyFake, но этова почемут не происходит...
Код


const
  WM_my_th = WM_USER + 1;

type
  Customer  = class(TObject)
  public
  cust_id : integer;
   procedure StartT;
  end;

  TMForm = class(TForm)
    Memo1: TMemo;
    btnStart: TButton;
    procedure btnStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  TH:array[1..3] of Customer;
  procedure WMMyFake(var Message: TMessage); message WM_my_th;
  end;

var
  MForm: TMForm;
  Custome: TList;

implementation

{$R *.dfm}

procedure SubDelay(Time: Cardinal);
 var
   Ticks: Cardinal;
 begin
   Ticks:= GetTickCount;
   while GetTickCount - Ticks < Time do
   begin
     SleepEx(50, True);
     Application.ProcessMessages
   end;
 end;


procedure TMForm.btnStartClick(Sender: TObject);
var
A: integer;
begin
for A:= 1 to 3 do
 begin
 TH[A]:= customer.create;
   TH[A].cust_id := A;
 begin
   TH[1].StartT;
  end;
 end;
end;

procedure TMForm.WMMyFake(var Message: TMessage);
var
  B: Integer;
  C: Customer;
begin
  B:= Integer(Message.WParam);
  if B = 3 then exit;
  C:=th[B+1];
  C.StartT;
end;

procedure Customer.StartT;
var
D,E: integer;
begin
PostMessage(Application.Handle, WM_my_th , Integer(cust_id), 0);
D:= 0;
for E:= 1 to 3 do
 begin
   D:= D+1;
   MForm.Memo1.Lines.Add(inttostr(D));
   SubDelay(1000);
  end;
 end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)