Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2009, 16:50   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию Потоки в Builder C++

В окне label и кнопка, при нажатии на кнопку в label появляются рандомные цифры, которые медленно меняются(есть задержка). Знаю что Sleep тут не поможет, а только навредит. Надо использовать новый поток. Может кто-нибудь написать как его создать и использовать в вышеизложенной задаче.

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     for(int i; i<100; i++) {
          Label1->Caption = rand()%100;
        // тут задержка
     }
}

Последний раз редактировалось NiCola999; 31.10.2009 в 16:54.
NiCola999 вне форума Ответить с цитированием
Старый 31.10.2009, 17:23   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А не проще ли таймер использовать? В Button1Click устанавливать
Код:
Timer1 -> Enabled = true;
и уже в нем совершать все действия.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 31.10.2009, 17:36   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

извиняюсь, я буквально сегодня начал изучать Builder. Поместил таймер на форму, но он не работает или работает, но это не заметно
в свойствах Enabled = false
Interval = 1000
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     for(int i; i<100; i++) {
          Label1->Caption = rand()%100;
          Timer1->Enabled = true;
     }
}

Последний раз редактировалось NiCola999; 31.10.2009 в 17:41.
NiCola999 вне форума Ответить с цитированием
Старый 31.10.2009, 17:36   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не знаю как в билдере, если не ошибаюсь там спец. класс для потоков есть, но на WinAPI создаётся поток функцией CreateThread. Все параметры, за исключением 3-го и 4-го можно выставить в 0, на MSDN описано их назначение. В качестве 3-го параметра нужно передавать указатель на функцию void __stdcall function_name(void* parameter);
4-й параметр - то, что передаётся в функцию потока при вызове. Всё это может выглядеть примерно так:
Код:
void ThreadFunction(void* hWnd)
{
    while(true) {
    // генерация случайного числа и конвертирование его в строку
    SetWindowText((HWND)hWnd, number_text);
    Sleep(1000);
    }

    return;
}

//в процедуре окна, по нажатию на клавишу:
HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, hLabel, 0, 0);
CloseHandle(hThread);

...

Цитата:
Сообщение от NiCola999
Поместил таймер на форму, но он не работает или работает, но это не заметно
в свойствах Enabled = false
Interval = 1000
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     for(int i; i<100; i++) {
          Label1->Caption = rand()%100;
          Timer1->Enabled = true;
     }
}
А что же Вы хотите от такого кода?) Присваиваете лабелу цифру и включаете таймер... 100 раз... = )
Наверное в Баттон1Клик должно быть включение таймера, после того, как таймер включён нужно перехватывать событие таймера(WM_TIMER в WinAPI, в билдере как-то иначе) и в нём уже менять текст лабела. Да, и не плохо было бы установить интервал таймера

Последний раз редактировалось netrino; 31.10.2009 в 17:56.
netrino вне форума Ответить с цитированием
Старый 31.10.2009, 18:04   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

=))
я думал когда его включаешь он начинает отсчитывать время и когда доодит до 0 он выключается и начинается следующая итерация.
Всё-таки интересно как создаются потоки в Builder е. В нете пока ниче не нашел

Последний раз редактировалось NiCola999; 31.10.2009 в 18:14.
NiCola999 вне форума Ответить с цитированием
Старый 01.11.2009, 10:49   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Про потоки не знаю, но что касается таймера, то выглядеть это будет так:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1 -> Interval = 500;
Timer1 -> Enabled = true;
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption = rand()%100;
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 01.11.2009, 13:30   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

то что надо, спасибо, а программа не будет зависать в течение этого интервала ? то есть как с командой sleep
NiCola999 вне форума Ответить с цитированием
Старый 01.11.2009, 13:37   #8
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Нет, насколько помню у таймера свой поток.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенести код из C++ Builder 5 в C++ Builder 2009 Kreadlling C++ Builder 2 13.09.2009 14:00
Builder C++ бинарные потоки,файлы Yakushov C++ Builder 1 21.12.2008 11:55
Потоки AidarBik Win Api 2 04.08.2008 10:00