Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Проблема с потоком.   Найти похожие ветки 

 
Xion ©   (2007-07-10 17:35) [0]

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


 
clickmaker ©   (2007-07-10 17:54) [1]


> поток он запускает  форму

а почему не наоборот?


 
Xion ©   (2007-07-10 19:20) [2]

А какая разница поток порождает форму или форма поток


 
Xion ©   (2007-07-10 19:23) [3]

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


 
Xion ©   (2007-07-10 19:55) [4]

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. сделал чтоб форма запускала поток (глухо как в танке)


 
trubin ©   (2007-07-10 21:45) [5]


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


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


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


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


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

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


 
Xion ©   (2007-07-11 10:43) [7]

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

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


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


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


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

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


 
Инс ©   (2007-07-11 10:50) [9]

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


 
Anatoly Podgoretsky ©   (2007-07-11 11:18) [10]

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

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


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


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


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


 
trubin ©   (2007-07-11 11:25) [12]


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

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

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


 
clickmaker ©   (2007-07-11 11:32) [13]


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

убрать Synchronize


 
Инс ©   (2007-07-11 11:41) [14]


> убрать Synchronize


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


 
clickmaker ©   (2007-07-11 11:55) [15]


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

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

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

:)


 
Xion ©   (2007-07-11 12:48) [16]

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


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


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


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

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


 
Xion ©   (2007-07-11 12:56) [18]

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


 
Инс ©   (2007-07-11 12:58) [19]


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


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


 
Xion ©   (2007-07-17 17:53) [20]

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


 
iXT ©   (2007-07-17 18:07) [21]

> Xion ©

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


 
Xion ©   (2007-07-18 11:16) [22]

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


 
iXT ©   (2007-07-18 11:23) [23]

> [22] Xion ©   (18.07.07 11:16)

В корне не верное решение. Операцию делай в отдельном потоке, а индикацию в основном.


 
Xion ©   (2007-07-18 11:30) [24]

я не именю деступа к главной форме я только имею доступ к индекатору


 
Xion ©   (2007-07-18 11:37) [25]

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


 
Xion ©   (2007-07-18 18:35) [26]

У кто может обяснить как визываеться WindowProc и что она делаеть. а точнея интересует замена ее для окна.[9] у етой програме реализована подмена WindowProc и как визвать реальную не подмениную WindowProc


 
iXT ©   (2007-07-19 09:10) [27]

> я не именю деступа к главной форме я только имею доступ
> к индекатору

Кто тебе говорил про главную форму. Читай [23] внимательно.


 
Xion ©   (2007-07-19 11:23) [28]

и саму операцыю я не делаю и не имею отношения к ней мне нужно селать независемую индекацию управлятся нею будет другой человек


 
iXT ©   (2007-07-19 11:39) [29]

> [28] Xion ©   (19.07.07 11:23)

Бред... ничего не понял.

Некто сделал что-то, к чему надо присобачить индикатор. Индикатор ты хочешь ляпить в доплнительном потоке. Т.е. создать в основном потоке дополнительный ты можешь, а создать форму нет. Так что ли?


 
Xion ©   (2007-07-19 14:46) [30]

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


 
Stanislav ©   (2007-07-19 15:02) [31]

Я думаю нужно для начала разобраться что такое Индекатор...


 
Stanislav ©   (2007-07-19 15:08) [32]

А вообще может тебе достаточно Application.ProcessMessages;
Установить в цикле основного потока и двигать там индикатор?


 
Xion ©   (2007-07-19 15:14) [33]

Application.ProcessMessages; розмораживает всю програму я мне надо только окно с индекатором


 
Сергей М. ©   (2007-07-19 15:19) [34]


> Application.ProcessMessages; розмораживает всю програму
> я мне надо только окно с индекатором


У "индекатора", вообще-то, есть св-во Update/

Равно, впрочем, как и у любой иной "беды" класса-наследника TControl.

Ну эт так, для сведения кулибиных)


 
Xion ©   (2007-07-19 16:28) [35]

смотри [4]

procedure TRunThread.Execute;

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

procedure TRunThread.Ext;

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

но втом то и дело что update блокирует окно


 
Сергей М. ©   (2007-07-19 16:30) [36]


> update блокирует окно
>


Чавоооо ?!


 
Сергей М. ©   (2007-07-19 16:32) [37]


> FForm.Update;


И какого лешего ты апдейтишь всю форму, если апдейта требует только "индекатор" ?


 
Xion ©   (2007-07-19 16:34) [38]

ну ладно может не апдайт я не уверен что лочит окно но ето так


 
Сергей М. ©   (2007-07-19 16:36) [39]


> я не уверен


Ну вот как будешь уверен, тогда и заходи - милости просим)

А без уверенности утверждениям подобного рода - грош цена)


 
iXT ©   (2007-07-19 17:05) [40]

> [30] Xion ©   (19.07.07 14:46)

Я не могу понять, откуда и как ты собираешься вызывать (создавать) дополнительный поток если
> я немогу трогать основной процес и точка!!!!!
=> основной поток; Хотя причем тут процесс?



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.069 c
2-1184754884
***mikle***
2007-07-18 14:34
2007.08.12
Class TSocketServer not found


2-1184326468
Квэнди
2007-07-13 15:34
2007.08.12
MediaPlayer и TCPServer


2-1184653157
Alex7
2007-07-17 10:19
2007.08.12
Что добавить в DataModule, чтобы он признал TDBGridEh


2-1184735926
Boga
2007-07-18 09:18
2007.08.12
Архивирование папки


3-1177505762
SerMaxx
2007-04-25 16:56
2007.08.12
Вопрос по Update полей через TQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский