[C++] Ну, можно и с потоками... Но лучше без них ;-)20.06.03 18:00 Число просмотров: 1717 Автор: 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, литературу, поиск на форуме. Многое уже было ;-)
Я не силен в программировании под 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 >
---
> Как можно организовать, чтобы программа сама вызывала эту > процедуру Button1Click с периодичностью, например, 5 минут > но при этом окно программы не "замирало". Т.е. была бы > какая-то многозадачность чтоли, насколько я понимаю. либо делай отдельный поток как уже говорилось ранее,
либо можно вызвать Application->ProcessMessages() в функции поиска файлов, для того чтобы дать возможность обработать события находящиеся в этот момент в очереди.
[Win32] SetTimer() или класс [C++ Builder, Delphi] TTimer20.06.03 15:41 Автор: HandleX <Александр М.> Статус: The 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
> .., но что это за FAQ, о котором здесь достаточно часто > говорят, и где его можно посмотреть? К сожалению, пока FAQа нет. На данный момент он находится в стадии подготовки, причем в последний месяц активность народа, занимающегося этим (каюсь, в том числе и меня), существенно снизилась. В товарном виде находится пара-тройка вопрос-ответов, но FAQ, состоящий всего из трех вопросов - это некузяво вроде как, поэтому пока это добро лежит в пассиве.
[C++] Спасибо всем за ценную (для меня) инфу23.06.03 13:58 Автор: Hux0r Статус: Незарегистрированный пользователь