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