Форум: "Начинающим";
Текущий архив: 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.54 MB
Время: 0.047 c