Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как можно организовать, чтобы программа сама вызывала процедуру Button1Click
Закрытая тема
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию Как можно организовать, чтобы программа сама вызывала процедуру Button1Click - 20.06.2003, 16:36

Я не силен в программировании под win32, но тем не менее подскажите пожалуйста как решить данную проблему:
На форме программки есть одна кнопка и при нажатии на нее она
просто сканирует каталог и проверяет есть ли в нем файлики *.err

//--------------------------------------------------------------
void __fastcall TFormMain::Button1Click(TObject *Sender)
{
TSearchRec sr;
int iAttributes = 0;
AnsiString ScanDir = "C:temp*.err";
done = FindFirst(ScanDir, iAttributes, sr);
while (!done)
{ // Нашли первый
MessageBox(NULL,"Обнаружен "+sr.Name,1);
}
// Следующий
done = FindNext(sr);
}
//--------------------------------------------------------------

Как можно организовать, чтобы программа сама вызывала эту процедуру Button1Click с периодичностью, например, 5 минут но при этом окно программы не "замирало". Т.е. была бы какая-то многозадачность чтоли, насколько я понимаю.
  (#2 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 20.06.2003, 18:12

Берешь ложишь на форму таймер (TTimer), задаешь свой интервал.
При создании формы Timer1.Enabled := True;

На обработчике событий таймера OnTimer, чтобы не городить велосипед пишешь

Button1Click(Sender);

И со спокойной совестю удаляешь с формы свою кнопку.
И все дела!
Успехов в начинании!
  (#3 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию Re: Помогите разобраться с вызовом процедур - 20.06.2003, 19:49

Цитата:
Originally posted by Hux0r
[b]Как можно организовать, чтобы программа сама вызывала эту процедуру Button1Click с периодичностью, например, 5 минут но при этом окно программы не "замирало". Т.е. была бы какая-то многозадачность чтоли, насколько я понимаю.
Многозадачность реализуется созданием отдельной нити (thread).
Для этого создается экземпляр класса, унаследованного от TThread, у него определяется метод Execute(), который и выполняет все необходимые действия.
Подробнее - MSDN и старина Джеф Рихтер.
  (#4 (permalink)) Старый
Dragon7 Dragon7 вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию 21.06.2003, 13:08

Конечно для реализации хорошей многозадачности в приложении нужно использовать потоки (см. TThreads в доке), но если ты имеешь ввиду подвисание окна приложения при выполнении неких вычислительных действий или действий в цикле,
то используй функцию ProcessMessages(), это даст возможнось
заставить окно отвечать на приходящие ей сообщения винды, типа
щелчки мишью или нажатие кнопок.
  (#5 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию Спасибо за ценную инфу - 21.06.2003, 14:31

Всем большое человеческое спасибо.
Повесил компаненту Timer, все ок.
Потоки для меня пока непонятны, а вот Application->ProcessMessages() мне помогло, теперь даже если в цикле мильон файло сканится, я теперь хоть могу формой подвигать, свернуть, разврнуть и понаблюдать за процессом визуально (у меня на форме отображается прогресс-бар)
Вот еще одна трудность только. Когда моя мегакульная прога находит в выборке некий избранный файл, она запускает кое-какое приложение вот таким образом:
CreateProcess(NULL,"c:alert.exe",NULL,NULL,FALSE,C REATE_DEFAULT_ERROR_MODE,NULL,NULL,&cif,&pi);
// Ждем пока не загрузится до конца (это мне надо обязательно)
WaitForInputIdle(pi.hProcess,INFINITE);
// ворочаем дальше

Проблема в том, что c:alert.exe загружается около минуты, долго. Форма естесственно опять "замораживается". Можно-ли без использования потоков, как-то этот недуг преодолеть?
Как-то заставить программку реагировать, в этот период ожидания?
Ads.
  (#6 (permalink)) Старый
Hux0r Hux0r вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию И еще... - 21.06.2003, 17:14

Как можно сгенерить звук в системном динамике? Без обращения напрямую к 61 порту, ибо у меня w2k, пробовал - не получается.
Может в с++ есть какая-то готовая функция/метод?
  (#7 (permalink)) Старый
Dragon7 Dragon7 вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию 21.06.2003, 17:35

Для генерации звука в динамике используй функцию Beep()
Подключать надо winbase.h
Вот её хелп:

The Beep function generates simple tones on the speaker. The function is synchronous; it does not return control to its caller until the sound finishes.

BOOL Beep(

DWORD dwFreq, // sound frequency, in hertz
DWORD dwDuration // sound duration, in milliseconds
);


Parameters

dwFreq

Windows NT:

Specifies the frequency, in hertz, of the sound. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).

Windows 95:

The parameter is ignored.

dwDuration

Windows NT:

Specifies the duration, in milliseconds, of the sound.

Windows 95:

The parameter is ignored.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

Windows 95:

The Beep function ignores the dwFreq and dwDuration parameters. On computers with a sound card, the function plays the default sound event. On computers without a sound card, the function plays the standard system beep.

See Also

MessageBeep
  (#8 (permalink)) Старый
Hux0r Hux0r вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию Спасибо - 21.06.2003, 18:12

Спасибо, Dragon7, заработало
А можно еще что-нибудь посоветовать по поводу моего предыдущего поста, или в без потоков в данном случае не обойтись?
  (#9 (permalink)) Старый
Dragon7 Dragon7 вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию 22.06.2003, 02:55

В принципе потоки - отличное решение,
советую попробовать.

Поначалу кажется запутанным и сложноватым,
но когда сделать что-то всё становится абсолютно ясным и прозрачным.

Может и ещё есть методы, но так сразу и не вспомнишь,
если чё вспомню - напишу.
  (#10 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 23.06.2003, 11:09

Да без потоков в таком случае боюсь ничего путного не выйдет. Надо CreateProcess выносить в отдельный поток. А чтоб еще меньше хлопот было надо и поиск выносить! Тогда на глаз будет не заметно действие поиска и запуска процесса!
  (#11 (permalink)) Старый
Hux0r Hux0r вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию ok - 24.06.2003, 09:35

Спасибо всем за ценную инфу. Засунул весь цикл проверки и запуска приложения в отдельный поток методом:

// Основная процедура
void Process1(void* pParams)
{
//-----------
// а в конце делаю
_endthread();
}

void Common()
{
_beginthread(Process1, 0, NULL);
}
И все круто, проблем нет. Правда нужно вроде как-то стек выделять, но и так работает
  (#12 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 24.06.2003, 15:05

Ну вот!
Ads
  (#13 (permalink)) Старый
Dragon7 Dragon7 вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2003
По умолчанию 24.06.2003, 17:23

Пряздрявляем
Кто ищет, тот всегда найдёт
Ads
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли создать рекурсивную процедуру sirius2009 Вопросы начинающих программистов 0 21.04.2009 11:04
Организовать в Lisp процедуру сложения двух полиномов lovelyevil Lisp 12 16.01.2008 22:49
Организовать в Lisp процедуру сложения двух полиномов NexX_33 Lisp 1 08.06.2007 13:48
TPerformanceGraph программа отключается сама по себе geo C++ Builder 2 30.06.2005 15:52
Как сделать чтобы при запуске программы форма сама подстраивалась под экран Ал-леша C++ Builder 3 25.05.2005 12:43
Как сделать что бы программа проверяла сама себя на зависание Garik888 Delphi 12 04.02.2005 13:45
Необходима печать накладной, как организовать чтобы в табличном виде выводилось NordProgz Delphi 0 19.01.2005 01:25
Как организовать доступ к разным свойствам по разным именам через одну процедуру Dian Delphi 4 10.12.2004 09:42
Как сделать, чтобы форма сама закрылась JuriS C++ Builder 3 18.02.2004 11:49
Можно ли программа сама себя изменять Shrike Алгоритмы 1 29.08.2003 17:42
Какой функцией программа может сама определить, в какой системе она работает Anonymous Visual C++ 2 04.01.2003 12:10
Программа, выводящая на экран сама себя Теневой Георг Pascal 8 04.01.2003 03:05



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов