информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





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

Удачи.
<programming> Поиск 






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


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