Здравствуйте !
Сейчас изучаю Потоки в билдере 5. Подскажите, как справиться с трудностью.
Описание разрабатываемой программы: на форме Windows графически отображается (в Label1) текущее время и рядом кнопка Button1 на закрытие программы.
Предполагаю поместить закрытие программы и отображение времени в отдельные потоки.
Для этого в Unit1.CPP пишу:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
Потом создаю новый Unit2.CPP и header file.
В Unit2.CPP прописываю код отображения времени:
void __fastcall Potok1::Execute()
{
int i = 0;
while (i<15)
{
Label1->Caption = Time();
_sleep (1);
Label1->Refresh();
i++;
}
//---- Place thread code here ----
}
В результате получаю сообщение:
[C++ Error] Unit2.cpp(36): E2451 Undefined symbol 'Label1'
Пожалуйста, растолкуйте, в чем моя ошибка и как ее поправить.
С уважением,
Alex
ops:
Threads
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Absurd,
>Потоки нужно использовать для внутренних частей программы, а не для GUI.
А это почему вдруг? Что-то я такой рекомендации майкрософт не видел;-).
alex2233,
Попробуй так в Unit2.CPP:
>TForm1->Label1->Caption = Time();
TForm1 у тебя скорее всего уже объявлена глобально.
А Label1 всего лишь одно из данных этого объекта, типа объект в объекте.
Label1 в Unit1.CPP ты можеш вызывать потому, что вызываешь его в методах TForm1 и там неявно вызывается указатель "this",
то есть this->Label1->Caption = Time();
Да и не забудь закрыть поток когда закрываешь форму, а то получишь Access Violation.
P.S. Вобще конечно тема названа не совсем корректно.
>Потоки нужно использовать для внутренних частей программы, а не для GUI.
А это почему вдруг? Что-то я такой рекомендации майкрософт не видел;-).
alex2233,
Попробуй так в Unit2.CPP:
>TForm1->Label1->Caption = Time();
TForm1 у тебя скорее всего уже объявлена глобально.
А Label1 всего лишь одно из данных этого объекта, типа объект в объекте.
Label1 в Unit1.CPP ты можеш вызывать потому, что вызываешь его в методах TForm1 и там неявно вызывается указатель "this",
то есть this->Label1->Caption = Time();
Да и не забудь закрыть поток когда закрываешь форму, а то получишь Access Violation.
P.S. Вобще конечно тема названа не совсем корректно.
-
- Сообщения: 1213
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
[quote="Booster"]Absurd,
>Потоки нужно использовать для внутренних частей программы, а не для GUI.
А это почему вдруг? Что-то я такой рекомендации майкрософт не видел]
Потому что GUI однопоточный везде и как правило требует внешнюю синхронизацию.
>Потоки нужно использовать для внутренних частей программы, а не для GUI.
А это почему вдруг? Что-то я такой рекомендации майкрософт не видел]
Потому что GUI однопоточный везде и как правило требует внешнюю синхронизацию.
2B OR NOT(2B) = FF