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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] В FAQ! 20.06.03 19:29  Число просмотров: 10466
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Можно начиная с этого места:
> Добро пожаловать в современные многозадачные операционки.
:)
<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