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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный или синхронный запуск 
:(
    Опции темы
eXa
Дата 15.8.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

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



Возможно ли запустить ниже приведенный код асинхронно, а что ещё лучше синхронно. Без использования класса 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







Это сообщение отредактировал(а) eXa - 15.8.2007, 18:55
PM MAIL   Вверх
dumb
Дата 15.8.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 3
Всего: 158



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

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

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



Цитата

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

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

Цитата

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


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

Это сообщение отредактировал(а) eXa - 15.8.2007, 20:21
PM MAIL   Вверх
ALeXandrK
Дата 15.8.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

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



Это сообщение отредактировал(а) ALeXandrK - 15.8.2007, 20:53


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
eXa
Дата 16.8.2007, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

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



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

Это сообщение отредактировал(а) eXa - 16.8.2007, 02:49
PM MAIL   Вверх
aktuba
Дата 16.8.2007, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата

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


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

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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
eXa
Дата 16.8.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

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



Я объяснил вполне даходчиво что мне надо
PM MAIL   Вверх
aktuba
Дата 16.8.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата

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


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

1
1
1
2
2
2
3
3
3


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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
eXa
Дата 16.8.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

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



Цитата

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

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

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

Вот помагли с кодесами, но вот незадача, в  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;



Это сообщение отредактировал(а) eXa - 17.8.2007, 17:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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