информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsГде водятся OGRыВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Периодический вызов процедуры 20.06.03 17:28  Число просмотров: 1006
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
> Я не силен в программировании под 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 минут
> но при этом окно программы не "замирало". Т.е. была бы
> какая-то многозадачность чтоли, насколько я понимаю.
либо делай отдельный поток как уже говорилось ранее,
либо можно вызвать Application->ProcessMessages() в функции поиска файлов, для того чтобы дать возможность обработать события находящиеся в этот момент в очереди.
<programming>
[C++] Периодический вызов процедуры 20.06.03 15:10  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Я не силен в программировании под 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 минут но при этом окно программы не "замирало". Т.е. была бы какая-то многозадачность чтоли, насколько я понимаю.
[C++] Периодический вызов процедуры 20.06.03 17:28  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
> Я не силен в программировании под 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 минут
> но при этом окно программы не "замирало". Т.е. была бы
> какая-то многозадачность чтоли, насколько я понимаю.
либо делай отдельный поток как уже говорилось ранее,
либо можно вызвать Application->ProcessMessages() в функции поиска файлов, для того чтобы дать возможность обработать события находящиеся в этот момент в очереди.
[Win32] SetTimer() или класс [C++ Builder, Delphi] TTimer 20.06.03 15:41  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Так у него окно замрет 20.06.03 16:34  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Пока работает обработчик сообщения - другие сообщения сидят в очереди.
Что будет если у него в дирректории миллион файлов ? Он даже закрыть это окно не сможет.
Только потоки спасут отца русской демократии.
[C++] можно поподробнее? 20.06.03 16:46  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> Что будет если у него в дирректории миллион файлов ? Он
> даже закрыть это окно не сможет.
> Только потоки спасут отца русской демократии.
а можно поподробнее про потоки и с чем их едят?
[C++] Ну, можно и с потоками... Но лучше без них ;-) 20.06.03 18:00  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 21.06.03 14:08  Количество правок: 5
<"чистая" ссылка> <обсуждение закрыто>
> > Что будет если у него в дирректории миллион файлов ?
> Он
> > даже закрыть это окно не сможет.
> > Только потоки спасут отца русской демократии.
У него, судя по приведённому куску кода, используются классы Borland VCL, поэтому во время обработки файлов можно вызывать Application->ProcessMessages() и проверять флаг Application.Terminated.

> а можно поподробнее про потоки и с чем их едят?
Добро пожаловать в современные многозадачные операционки.
Поток — это объект ядра OS Windows. Кратко это примерно выглядит так... В самом начале загрузки компьютера OS программирует один из аппаратных таймеров на срабатывание через очень малые промежутки времени. А при аппаратном прерывании от этого таймера управление в конце концов передаётся т.н. Sheduler'у — подпрограмме-планировщику процессов. Этот планировщик смотрит, какому из созданных OS процессов нужно в данный момент отдать этот кусочек времени, который останется до следующего прерывания. У процессов есть приоритеты. И вот, исходя из приоритетов и статистики планировщик переключает контекст процесса (виртуальную память) на соотв. процесс. У каждого процесса своё виртуальное адресное пространство, и они не могут повредить друг другу теоретически ;-). Если два разных процесса захотят что-то использовать совместно, им нужно выбирать и использовать какой-нибудь механизм межпроцессного взаимодействия — будь то файл, разделяемая память или что-нибудь ещё (почитай про Interprocess Communications).
И каждый процесс имеет т.н потоки [исполнения]. Они исполняются независимо во времени в виртуальной памяти процесса, которому принадлежат, у них разный стек.
Когда создаётся процесс, OS также автоматически создаёт для него первичный поток, который начнёт исполняться с адреса, указанного в заголовке файла образа (*.exe). Потом этот поток может породить другие потоки (познакомся с функциями API CreateProcess, CreateThread, ExitThread, ExitProcess и т.п.).
Но вернёмся к планировщику... Определив, что нужно передать управление одному из процессов, он смотрит, контекстом (регистры, стек) какого потока будет загружен микропроцессор. На это влияют много факторов. У потоков есть приоритеты, они могут ожидать события, быть просто остановленными (функции SuspendThread, ResumeThread, Sleep, WaitForSingleObject и прочая)... И ещё. На самом деле процессы в OS — это всего лишь логические структуры, а вот в потоках исполняется реальный код...

Ну и вот, процессор может быть один в системе, но прерывания таймера происходят сотни раз в секунду... Поэтому создаётся ощущение плавности и параллельности исполнения задач — программы работают псевдо-одновременно — набираешь текст в MS Word, он проверяет его как-бы параллельно, WinAmp воспроизводит музон, и злобный вирус заражет пользовательские файлы ;-)

Всё это звучит красиво, но съевший собаку программист несколько раз подумает, прежде чем запустить новый поток на исполнение. Многопоточность требует тщательной синхронизации и осторожности при обращении к совместно используемым объектам (переменным, вызовам API и прочая).. В среде Borland рекомендуется использовать BeginThread вместо API-шной функции, тогда правильно будут выставлены некоторые флаги (IsMultiThread, к примеру). Также можно использовать класс TThread, он достаточно функционален.

Читай MSDN, литературу, поиск на форуме. Многое уже было ;-)

Удачи.
[C++] В FAQ! 20.06.03 19:29  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Можно начиная с этого места:
> Добро пожаловать в современные многозадачные операционки.
:)
извиняюсь за оффтоп... 21.06.03 08:07  
Автор: makeworld Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
.., но что это за FAQ, о котором здесь достаточно часто говорят, и где его можно посмотреть?
извиняюсь за оффтоп... 21.06.03 15:30  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> .., но что это за FAQ, о котором здесь достаточно часто
> говорят, и где его можно посмотреть?
К сожалению, пока FAQа нет. На данный момент он находится в стадии подготовки, причем в последний месяц активность народа, занимающегося этим (каюсь, в том числе и меня), существенно снизилась. В товарном виде находится пара-тройка вопрос-ответов, но FAQ, состоящий всего из трех вопросов - это некузяво вроде как, поэтому пока это добро лежит в пассиве.
[C++] Спасибо всем за ценную (для меня) инфу 23.06.03 13:58  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach