Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция, ожидающая поступления данных (как showmodal) [D6, XP]


Страницы:   1 2

Mr tray ©   (2006-07-15 01:01:00) 

Здравствуйте. Я хочу сделать такую штуку. Есть код в юните, который в данный момент выполняется. В какой то миг приходит очередь выполниться одной функции, задача которой остановить выполнение кода, дождаться поступления данных извне, обработать полученные данные, выдать определенный результат и пустить выполняться код дальше. Можно сделать это с помощью цикла, выход из которого возможен только после изменения определенной глобальной переменной (которая будет изменена извне). Но хотелось бы, чтоб это выглядело, примерно как a:=myform.showmodal; case a of .... и тп. Только вместо showmodal моя функция.


Kolan   (2006-07-16 00:28:00) [1]


> аа. всё. врубился вроде. вместо execute надо resume написать?

Как это  - вообще бред, где написать , зачем...

Если поток создан НЕ спящим Execute стартует после создания...


Kolan   (2006-07-16 00:26:00) [2]


> А как я должен оформить, покажи, пожалуйста.

http://www.citforum.ru/programming/delphi/style_delphi/

Те не:

> waitforsingleobject(ev,INFINITE);

а,

WaitForSingleObject(Ev,INFINITE);


> аа. всё. врубился вроде. вместо execute надо resume написать?


Таак.... краткий обзор.
Код помешенный в Execute выполнится в контексте потока.
Далее смотрим пост 1
Всю работу вставляещь в поток, затем ожидание, затем то что надо сделать кода данные пришли.

Те пример:

procedure Execute;
begin
 {Создали Event.}
 {Работаем}
 if WaitForSingleObject(ev,INFINITE) = WAIT_OBJECT_0 then  //Ждем
   {Дождались, делаем остальное}
 {В конце выдали результат с помощью любого механизма: SendMessage, событие итд... }
end;


Далее.
create(b:boolean);
Если B = True, то по ток создасться спящим.

Кроме того не забудь перекрыть(override) метод Execute.


> Всё равно виснет

Странный вопрос. Значит ты что-то оставил в гл. потоке.

PS
 Незабудь что почти вся VCL НЕ потоко безапасна. Поэтому используй механизмы синхранизации( Synchronizeнапример) для вывода результатов работы.

PPS
А вообще гораздо проще прочесть Тейкста и Пачеко и все на места встанет...


Mr tray   (2006-07-15 23:52:00) [3]

аа. всё. врубился вроде. вместо execute надо resume написать?


Mr tray   (2006-07-15 23:32:00) [4]

constructor Ttype.create(b:boolean);
begin
 inherited create(b);
 execute;
end;

procedure Ttype.execute;
begin
 ev:=CreateEvent(nil, True, false, nil);
 waitforsingleobject(ev,INFINITE);
 ... и тд ...
end;


Всё равно виснет. Читал хелп. Там сказано: в execute должна содержаться функция потока (The Execute method is your thread function). Что я ещё должен сделать, чтоб всё работало?


Mr tray   (2006-07-15 22:36:00) [5]


>  И оформлять научись.. читать трудно..

А как я должен оформить, покажи, пожалуйста.


Kolan   (2006-07-15 21:24:00) [6]

Кажется про потоки ты недочитал... Читай про Execute..
PS
 И оформлять научись.. читать трудно..


Джо   (2006-07-15 19:18:00) [7]

Поток (в данном случае, главный) был заморожен до возникновения события.


Джо   (2006-07-15 19:17:00) [8]

> а именно на waitforsingleobject, ВСЯ моя программа повисает.

А чего же ты добивался, как не этого?


Mr tray   (2006-07-15 19:14:00) [9]

Так. Значит. Делаю так:
unit gameSystem;

interface

uses
 messages,windows,classes;

type
 ... типы ...
 Ttype=class(Tthread)
   ... разная дребедень ...
 public
   ev:thandle;
   constructor create(b:boolean);
 end;

implementation

constructor Ttype.create(b:boolean);
begin
 inherited create(b);
 ev:=CreateEvent(nil, True, false, nil);
 waitforsingleobject(ev,INFINITE);
 ... и тд ...
end;

end.


Но на ttype.create, а именно на waitforsingleobject, ВСЯ моя программа повисает. ttype.create я вызываю при create главной формы моего приложения. Что я делаю не так?


Ketmar   (2006-07-15 16:39:00) [10]

>Kolan ©   (15.07.06 13:30) [11]
а если он замер в "позе зю"? и потом из этой позы выпал? не надо суспендить потоки без нужды. лучше WaitForXXX().


Kolan   (2006-07-15 13:30:00) [11]


> хм. суспендить поток чревато. мало ли, где он там остановится.
> ..

А что череватого? Делале дела, заснул, как данные пришли, его будят... Но можно и Wait функциями...


Kolan   (2006-07-15 13:28:00) [12]


> а как запихнуть юнит в другой поток (если так, конечно,
> можно выразиться)?

Так конечно выражаться не правильно...
Для этого есть класс TThread + F1.


Mr tray   (2006-07-15 13:00:00) [13]

а как запихнуть юнит в другой поток (если так, конечно, можно выразиться)?


Leonid Troyanovsky   (2006-07-15 11:33:00) [14]


> Mr tray   (15.07.06 01:50) [3]

> за объектами определенных категорий. можно ли как то подогнать
> мой случай под эти условия, чтоб можно было применить waitforsingleobоect?


Можно, например, ожидать завершения потока (TThread.Handle)

Ну, а это - как можно ожидать:

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/c355993ba823b53c

--
Regards, LVT.


Ketmar   (2006-07-15 11:21:00) [15]

хм. суспендить поток чревато. мало ли, где он там остановится...


Kolan   (2006-07-15 10:44:00) [16]


> а Х их знает..... я не знаю, как их использовать. Если поможете,
>  буду премного благодарен.

Подойдут..
Но учти если ты будешь ждать в главном потоке, то на время ожидания приложение "повиснет". Поэтому для ожидания заведи дополнительный поток. Кроме этих ф-ций вполне подойдут методы потока(класса TThread) - Suspendи Resume.


Loginov Dmitry   (2006-07-15 08:23:00) [17]

> а Х их знает..... я не знаю, как их использовать


- Создание Eventa: H = CreateEvent(nil, True, True, nil);
- Ожидание: WailForSingleObject(H, DWORD(-1)) - если объект-событие в состоянии "Откл", то замораживает текущий поток до тех пор, пока его состояние не станет "Вкл".
- SetEvent(H) - переход в состояние "Вкл"
- ResetEvent - переход в состояние "Откл"
- CloseHandle(H) - "уничтожение" объекта-события. Делается в самом конце, когда объект уже не нужен.


DrPass   (2006-07-15 02:54:00) [18]

В общем случае можно. Есть "пользовательские" объекты, например, Event'ы. Ты можешь в нужной ситуации запустить event, и ожидающая его функция сразу же продолжит работу.


Mr tray   (2006-07-15 01:50:00) [19]

как я понимаю, waitforsingleobоect может следить только за объектами определенных категорий. можно ли как то подогнать мой случай под эти условия, чтоб можно было применить waitforsingleobоect?


Mr tray   (2006-07-15 01:29:00) [20]

а Х их знает..... я не знаю, как их использовать. Если поможете, буду премного благодарен.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо