![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с потоком. [D7, WinXP]
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]Важно когда основная форма висит то форма потока тоже висит с ней