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

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

Проблема с потоком. [D7, WinXP]


Страницы:   1 2 3

Xion ©   (2007-07-10 17:35:00) 

Здрасти. Есть одна проблема у меня есть поток он запускает  форму на ней стоит ProgressBar поток просто обновляет форму только вот получается когда основная форма делает цикл то форма потока зависает пока цикл не пройдот. Как сделать чтобы форма потока не зависала а постоянно обновлялась (условия основную форму не трогать) ?


Xion   (2007-07-18 11:16:00) [21]

[21] ето индекатор процеса просто если основное приложения делает  какуюто операцию я немого увидеть индекатор процеса он зависает вместе с ним и когда я нажимаю на основное приложения я его не увижу приходится сделать такое свернуть все окна и тогда я увижу индекатор, поетому я решил сделать индекатор максимально независимым от потока (сори за ошыбки)


iXT   (2007-07-17 18:07:00) [22]

> Xion ©

1. А зачем тебе дополнительный поток?
Если обоснуешь зачем он тебе, тогда:
2. зачем вообще делают дополнительные потоки?


Xion   (2007-07-17 17:53:00) [23]

[9] делаю похожою форму но возникла проблема у меня есть Caption он один раз выставляется при содании форми и при смене активности изчезает и непоявляется


Инс   (2007-07-11 12:58:00) [24]


> [9] ето нормально но вот ета панель должна быть диначической
> (например поставить кнопку "Отменить" или "Паузу")


Поставьте. Никто же не заставляет использовать именно это. Можно сделать по образу и подобию


Xion   (2007-07-11 12:56:00) [25]

[9] ето нормально но вот ета панель должна быть диначической (например поставить кнопку "Отменить" или "Паузу")


Сергей М.   (2007-07-11 12:51:00) [26]


> ето что за константа чтото не могу найти ее


От балды она взята.

В кач-ве нее можешь задать любую свою в диапазоне ]WM_USER; MAXWORD]


Xion   (2007-07-11 12:48:00) [27]

WM_UPDATE_PROGRESS_PLEASE ето что за константа чтото не могу найти ее


clickmaker   (2007-07-11 11:55:00) [28]


> [14] Инс ©   (11.07.07 11:41)

ну да. все еще проще

while not Terminated do begin
  PostMessage(Form2Handle, WM_UPDATE_PROGRESS_PLEASE, 0, 0);
  Sleep(100);
end;

:)


Инс   (2007-07-11 11:41:00) [29]


> убрать Synchronize


Не все так просто. В [12] все написано.


clickmaker   (2007-07-11 11:32:00) [30]


> [5] так тогда как зделать чтоб вторая форма была полностю
> робочей

убрать Synchronize


trubin   (2007-07-11 11:25:00) [31]


> [5] так тогда как зделать чтоб вторая форма была полностю
> робочей

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

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


Инс   (2007-07-11 11:24:00) [32]


> По Архангельскому делал?


Ясный болт, тоже по Syncronize определили?


Anatoly Podgoretsky   (2007-07-11 11:18:00) [33]

> Xion  (10.07.2007 19:55:04)  [4]

По Архангельскому делал?


Инс   (2007-07-11 10:50:00) [34]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1169
Пойдет?


Сергей М.   (2007-07-11 10:50:00) [35]


> так тогда как зделать чтоб вторая форма была полностю робочей


Убрать этот бестолковый цикл

for i := 0 to 100 do begin
  sleep(100);
end;


Xion   (2007-07-11 10:43:00) [36]

[6] я имел виду поток на уровне класов.

[5] так тогда как зделать чтоб вторая форма была полностю робочей


Сергей М.   (2007-07-11 08:32:00) [37]


> Xion ©   (10.07.07 19:20) [2]
> какая разница поток порождает форму или форма поток


"поток порождает форму" - это еще можно понять как "в потоке вызывается конструктор класса формы"

"форма порождает поток" - а вот это нонсенс. Поток может быть порожден только другим потоком.


trubin   (2007-07-10 21:45:00) [38]


> Важно когда основная форма висит то форма потока тоже висит
> с ней


И должна висеть. Что делает метод Synchronize (см. Classes.pas) - отправляет сообщение CM_EXECPROC в первичный поток приложения. Если первичный поток завис, то выборки сообщений из очереди первичного потока не происходит, и твоя форма потока тоже висит.


Xion   (2007-07-10 19:55:00) [39]

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   pbM: TProgressBar;
   pbS: TProgressBar;
   procedure FormCreate(Sender: TObject);
   Procedure Run();
   Procedure Stop();
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TRunThread = class (TThread)
 FForm: TForm2;
   procedure Ext;
 public
   procedure Execute(); override;

 end;

var
 Form2: TForm2;
 Thr: TRunThread;
 i : integer;
implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
 Thr := TRunThread.Create(true);
 Thr.FForm := Form2;
end;

{ TRunThread }

procedure TRunThread.Execute;

begin
 inherited;
 i := 0;
 while not Terminated do begin
   Synchronize(Ext);
   Sleep(100);
 end;
end;

procedure TForm2.Run;
begin
 Form2.Show;
 Thr.Resume;
end;

procedure TForm2.Stop;
begin
 Thr.Terminate;
 FreeAndNil(Self);
end;

procedure TRunThread.Ext;

begin
 FForm.pbM.Position := i;
 FForm.pbS.Position := 100 - i;
 FForm.Update;
 inc(i);
end;

end.
Модуль Форми и потока
unit Unit1;

interface

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

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

var
 Form1: TForm1;
 Frorm : TForm2;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 I: integer;
begin
 Frorm := TForm2.Create(nil);
 Frorm.Run;
 for i := 0 to 100 do begin
   sleep(100);
 end;
 Frorm.Stop;

end;

end.
Модуль основной форми

p.s. сделал чтоб форма запускала поток (глухо как в танке)


Xion   (2007-07-10 19:23:00) [40]

Важно когда основная форма висит то форма потока тоже висит с ней


Страницы:   1 2 3

Наверх

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