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

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

Запуск расчета сразу после отрисовки формы


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

Franzy ©   (2009-09-01 13:43:00) 

Есть программа, выполняющая некий трудоемкий расчет. Нужно, чтобы расчет начинался сразу после запуска программы, при этом окно программы должно быть активировано, т.е. в фокусе и поверх остальных окон, т.к. на форму в соотв. оконшки выводятся различные компоненты отчета о прогрессе расчета.

Если пуск прописать в OnCreate, окошко не рисуется вообще до окончания расчета. В OnShow - окошко не активируется. Вставка form1.activate не помогает. Т.е. программа статует как бы в свернутом состоянии. Причем при этом "висит" и не разворачивается, несмотря на вставки Application.processmessages при каждом обновлении отчета.

Как это реализовать правильно?


Медвежонок Пятачок   (2009-09-01 14:56:00) [21]

ну так и используй его. а тот код,  что с ошибкой сотри.


clickmaker   (2009-09-01 14:55:00) [22]

> GridThread.Execute;

это не нужно.
если параметр в конструкторе false, он сразу запустится.
если true, то после установки свойств треда нужно вызвать Resume


Franzy   (2009-09-01 14:54:00) [23]


> GridThread.Execute; запускай в отдельном методе, после начальных
> обработчиков.


Вот такой код прекрасно работает:


unit Unit1;

interface

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

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

 TMyThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

var
 Form1: TForm1;
 MyThread: TMyThread;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
begin
 form1.caption:='Hello World';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 MyThread:=TMyThread.create(false);
 MyThread.Execute;
end;

end.


Медвежонок Пятачок   (2009-09-01 14:52:00) [24]

но ошибка все равно выскакивает.

в [9] можно узнать почему это происходит.


Медвежонок Пятачок   (2009-09-01 14:50:00) [25]

Сделал тестовое приложение, в котором только тред, меняющий капшн формы - все работает нормально, ошибки нет.

мало тредов потому и нет. а еще просто потому нет потому что повезло.

зы
пациент помойму просто хочет поболтать или пытается прикалываться над форумом


Franzy   (2009-09-01 14:49:00) [26]

Закомментиовал коллбэк (в смысле, функция теперь ничего не делает), но ошибка все равно выскакивает.


Медвежонок Пятачок   (2009-09-01 14:48:00) [27]

Там не один десяток страниц :(

Может тебе и ответы давать многоточием?
:)))


Anatoly Podgoretsky   (2009-09-01 14:47:00) [28]

> Franzy  (01.09.2009 14:41:15)  [15]

GridThread.Execute; запускай в отдельном методе, после начальных обработчиков.


Franzy   (2009-09-01 14:46:00) [29]


> Это очень мудро, привести здесь весь код, а тот который
> имеет отношение к ошибке заменить многоточием


Там не один десяток страниц :(


Franzy   (2009-09-01 14:46:00) [30]

Сделал тестовое приложение, в котором только тред, меняющий капшн формы - все работает нормально, ошибки нет. Может быть, дело в том, что из треда у меня вызывается процедура длл, которая вызывает коллбэк, который находится внутри основной программы?


Медвежонок Пятачок   (2009-09-01 14:45:00) [31]

Это очень мудро, привести здесь весь код, а тот который имеет отношение к ошибке заменить многоточием


Franzy   (2009-09-01 14:41:00) [32]

Я хочу разобраться с тредами, мне это может пригодиться в других приложениях :)

Сделал через треды так:


unit Main;

interface

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

type
 TForm1 = class(TForm)
 .....
 end;

 TMyThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

var
 Form1: TForm1;
 GridThread : TMyThread;

///////////////////////////////  

implementation

{$R *.dfm}

.......

procedure TMyThread.Execute;
begin

....

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

 GridThread:=TMyThread.Create(false);
 GridThread.Execute;

end;

end.


Вылетает с ошибкой 'Canvas does not allow drawing'


Сергей М.   (2009-09-01 14:31:00) [33]


> можно ли обращаться внутри треда к элементам формы


Это смотря что ты подразумеваешь под "элементами формы"


Медвежонок Пятачок   (2009-09-01 14:29:00) [34]

Автор, в обработчике OnCreate посылай сам себе сообщение c помощью postmessage

в обработчике сообщения все уже будет отрисовано. в нем и запускай свои мега-расчеты.


Сергей М.   (2009-09-01 14:29:00) [35]


> Franzy   (01.09.09 14:22) [10]



> мне нужно ПОСЛЕ их окончания


Просто создавай форму ПОСЛЕ их окончания.


Медвежонок Пятачок   (2009-09-01 14:26:00) [36]

если я объвлю класс треда внутри модуля формы)?

Модуль формы - понятие времени написания программы.
После F9 никаких модулей уже нет и нет разницы где задекларирован класс потока.


Franzy   (2009-09-01 14:22:00) [37]

Я так понимаю, проблема в том, что onCreate и onShow вызываются прямо ПЕРЕД тем, как окончатся соотв. процессы. А мне нужно ПОСЛЕ их окончания :( Похоже, придется использовать треды. Кстати, сразу вопрос по ним: можно ли обращаться внутри треда к элементам формы (если я объвлю класс треда внутри модуля формы)?


Медвежонок Пятачок   (2009-09-01 14:17:00) [38]

можно, если поток главный.


Franzy   (2009-09-01 14:16:00) [39]

А внутри потока можно обращаться к объектам формы?


Медвежонок Пятачок   (2009-09-01 14:14:00) [40]

у него же уже колбаки вовсю прогресс расчета рисуют. чем не место для процессмессаджес?


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

Наверх

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