IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Событие полсе запуска приложения. (http://www.imho.ws/showthread.php?t=84121)

Dragon31337 19.04.2005 16:50

Событие полсе запуска приложения.
 
Какое событие мне бы обрабатывать, чтобы начинать работу срразу после того, как приложение запущено, форма создано.
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint
я последовательность то знаю, но ни одно не подходит же, как мне кажется.
Так как OnCreate елис буду обрабатывать, то измение лейблов, скажем на форме будет не видно. А все остальные могут по несколько раз происходить во время работы с приложением. =(
Что подскажете?

ЕЖ 19.04.2005 18:46

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

/7y3uK 19.04.2005 20:03

Уточни, что ты собрался делать... если тебе важно, чтобы отображалось (прорисовывалось) в окне что-то, те же лейблы на пример, то естественно - onPaint, тока не забывай репейнт делать принудительный...

Dragon31337 19.04.2005 23:24

Я делаю вебапдейт. На форме лейбл, в котром будет написан ход обновления.
Типа подключаюсь, скачиваю файл такой-то, и т.п. Вмысле репейнт принудительный?
Я если делаю он пейнт то лейбл еще не появляется, только форма.

/7y3uK 20.04.2005 10:17

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

ПыСы
принудительно - это дергать метод репейнт

Dragon31337 20.04.2005 13:13

Я с threadami не работал, можно поподробнее.
Я если в онпейнт делаю
Form1->Label1->Cation = "Тут текущее сотояние обновления";
for (;;) тут эмуляция работы

то эта лабла так и не проявляется;

Dragon31337 20.04.2005 15:43

решил сделать через сообщения послать форме сообщения. Когда приложение запустится приедт время обработки сообщений. Тогда мое сообщение и обработается. Обработчик сообщения написал, но вот досада, у меня не посылается ообщение.
Application->CreateForm(__classid(TForm1), &Form1);
PostMessage(Form1->Handle,WM_RUNUPDATE,0,0);
Application->Run();

Я вставил послыку сообщения после create и перед раном. форма уже поидее создана, а он мне ошибку:
[C++ Error] webupd.cpp(15): E2315 'Handle' is not a member of 'TForm1', because the type is not yet defined
Как н создана? перед этим же create стоит =(

dyr_farot 20.04.2005 16:24

добавь #include "Unit1.h" ( или где эта форма описана )

Al-x 20.04.2005 18:16

Цитата:

Dragon31337:
Form1->Label1->Cation = "Тут текущее сотояние обновления";
for (;:Wink: тут эмуляция работы
Если я правильно понял, то в цикле что-то делается с Caption лейбла. Можно по простому сделать Application->ProcessMessages(); (ну или как там в BC). Должно обновиться (в Delphi работает :))+приложение не подвисает на время работы цикла.

Dragon31337 20.04.2005 19:15

dyr_farot, если я добавлю, мне скажет потом при компиляции, что повтороне деклалирование класса TForm1, так что ничего там боавлять не надо.
Al-x, я что-то не понял.

dyr_farot 20.04.2005 19:17

ничего он не скажет ( на то #ifndef Unit1H ) написано.

Dragon31337 20.04.2005 19:56

dyr_farot, я прежде чем написать, попробовал.

dyr_farot 20.04.2005 20:00

э... я тоже проверил...
ты, случайно из файла заголовка строки
#ifndef Unit1H
#define Unit1H

не вытер?

Al-x 21.04.2005 09:34

Цитата:

Dragon31337:
я что-то не понял.
Я не отрицаю, что и я чего-то не понял, но вот что я имел ввиду:
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i;
 for(i=0;i<=1000;i++)
 {      /*
        здесь происходит какой-то процесс (вычисление очередного  значения, описывается ход обновления...)
        .....
        */
        Label1->Caption = IntToStr(i);
        Application->ProcessMessages();
 }
}

Короче, каждый раз после того, как ты изменил Caption, ты вызываешь Application->ProcessMessages(); (цикл это так, для красоты :))
Или это не то, что ты описывал в #4 и #6 постах?

/7y3uK 21.04.2005 10:14

Цитата:

Сообщение от Dragon31337
Я с threadami не работал, можно поподробнее.
Я если в онпейнт делаю
Form1->Label1->Cation = "Тут текущее сотояние обновления";
for (;;) тут эмуляция работы

то эта лабла так и не проявляется;

а она у тебя не появляется потому что у нее кэпшн = "" пустой строке :)
ты дебажить попробуй и проверь :) то что вы тут делаете - это изврат полнейший....
треды это очень просто, но объяснять долго... вот произошло у тя событие обновления (не важно какое, на пример нажали кнопку "обновить") мы открываем тред, в котором делаем все вычисления и пр.пр.пр.... на формочке у тя есть метод синхронизированный чтото типа setLabelCaption - который ты сам пишешь ессесно, но фишка в том, что он синхронизированный, а делает метод простую весчь - ставит лейбле кепшн по входному парамеру... в ходе вычислений в своем тредике просто выдергиваем в нужных местах этот метод и все будет чики пуки... :yees:

Dragon31337 21.04.2005 10:59

/7y3uK, я так понимаю, это через TThread делать предлагаешь. Хм. Пойду поищу-почитаю. Ты бы ссылку дал =) Не читать же мне хелп на английском =)

ЕЖ 21.04.2005 11:06

Dragon31337
http://callipso.bestcode.org/delphi/artical/num2.html

Dragon31337 25.04.2005 13:37

Сделал класс поток. В нем есть функция синхронизации, котрая должна обновлять кепшн на форме. Функция потока вызывает функцию, которая как параметр - указатель на функцию харнится вв ее свойствах.
typedef void (*MyFunc)(AnsiString);
class TUpdThread : public TThread
{
private:
protected:
void __fastcall Execute();
void __fastcall UpdateCaption();
void __fastcall GetRegistryVals();
public:
__fastcall TUpdThread(bool CreateSuspended);
void __fastcall SetUpdProc(MyFunc NewUpdProc);
};

void __fastcall TUpdThread::SetUpdProc(MyFunc NewUpdProc){
UpdateFunc = NewUpdProc;
}

void __fastcall TUpdThread::UpdateCaption(){
UpdateFunc(Message);
Sleep(1);
}

У формы сделал функцию:
__fastcall TMainForm::SetCaption(AnsiString Value){
Report->Caption = Value;
}

Но опять встает та же проблема:
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
TUpdThread *UpdateThread = new TUpdThread(true);
UpdateThread->SetUpdProc(MainForm->SetCaption);
// UpdateThread->Resume;
Application->Run();

не могу я этот метод там указывать как параметр эту функцию передать, говорит, что еще класса нет =(

ТАК! Вписал #include <formunit.h>, ошибку не выдает, но!
Теперь ему не нравится вот что:
Cannot convert 'void (* (_closure )(AnsiString))(AnsiString)' to 'void (*)(AnsiString)'

ЕЖ 25.04.2005 13:45

Dragon31337
Запихни создание потока в конструктор главной формы.
А метод для обновления Caption из потока надо вызывать с помощью Synchronize.

Dragon31337 25.04.2005 17:50

А ьеперь самое главное. Как мне узнать об окончании процесса и закрыть приложение.

dyr_farot 25.04.2005 17:53

в конце Execute() потока сам закрывай приложение.
если нужно еще что-то -- пошли главной форме сообщения и в его обработчике выполняй все что нужно

ЕЖ 25.04.2005 19:52

Цитата:

Dragon31337:
А ьеперь самое главное. Как мне узнать об окончании процесса и закрыть приложение.
Для этого у TThread есть событие OnTerminate - от туда и закрывай приложение.

Dragon31337 25.04.2005 21:08

Писать там Application->Terminate как-то не красиво =(

ЕЖ 25.04.2005 21:33

А зачем Application->Terminate? Достаточно Close() ;)
OnTerminate выполняется когда поток уже завершил свою работу, и выполняется в контексте главного потока приложения.


Часовой пояс GMT +4, время: 14:40.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.