Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Ну, можно и с потоками... Но лучше без них ;-) 20.06.03 18:00 Число просмотров: 1535
Автор: 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, литературу, поиск на форуме. Многое уже было ;-)
Удачи.
|
|
|