Tad писал(а):
Хаб прекрасно справляется с их работойНю, ню. А ты в момент цикла пробовал форму двигать
------------ Дoбавленo:
Вы воообще-то интересовались, что такое поток, и зачем он нужен. Придется цитировать Маркса, пардон, Рихтера
Рихтер писал(а):
В каких случаях потоки создаются
Поток (thread) определяет последовательность исполнения кода в процессе. При инициализации процесса система всегда создает первичный поток. Начинаясь со стартовою кода из библиотеки С/С++, который в свою очередь вызывает входную функцию (WinMain, wWinMain, main или wmain) из Вашей программы, он живет до того момента, когда входная функция возвращает управление стартовому коду и тот вызывает функцию ExitProcess. Большинство приложений обходится единственным, первичным потоком. Однако процессы могут создавать дополнительные потоки, что позволяет им эффективнее выполнять свою работу
У каждого компьютера есть чрезвычайно мощный ресурс — центральный процессор. И нет абсолютно никаких причин тому, чтобы этот процессор простаивал (не считая экономии электроэнергии). Чтобы процессор всегда был при деле, Вы нагружаете его самыми разнообразными задачами. Вот несколько примеров
Вы активизируете службу индексации данных (content indexing service) Windows 2000. Она создает поток с низким приоритетом, который, периодически пробуждаясь, индексирует содержимое файлов на дисковых устройствах Вашего компьютера. Чтобы найти какой-либо файл, Вы открываете окно Search Results (щелкнув кнопку Start и выбрав из меню Search команду For Files Or Folders) и вводите в поле Containing Text нужные критерии поиска. После этого начинается поиск по индексу, и на экране появляется список файлов, удовлетворяющих этим критериям. Служба индексации данных значительно увеличивает скорость поиска, так как при ее использовании больше не требуется открывать, сканировать и закрывать каждый файл на диске
Вы запускаете программу для дефрагментации дисков, поставляемую с Windows 2000. Обычно утилиты такого рода предлагают массу настроек для администрирования, в которых средний пользователь совершенно не разбирается - например, когда и как часто проводить дефрагментацию. Благодаря потокам с более низким приоритетом, Вы можете пользоваться этой программой в фоновом режиме и дефрагментировать диски в те моменты, когда других дел у системы нет.
Нетрудно представить будущую версию компилятора, способную автоматически компилировать файлы исходного кода в паузах, возникающих при наборе текста программы. Тогда предупреждения и сообщения об ошибках появлялись бы практически в режиме реального времени, и Вы тут же видели бы, в чем Вы ошиблись. Самое интересное, что Microsoft Visual Studio в какой-то мере уже умеет это делать - обратите внимание на секцию ClassView в Workspace
Электронные таблицы пересчитывают данные в фоновом режиме
Текстовые процессоры разбивают текст на страницы, проверяют его на орфографические и грамматические ошибки, а также печатают в фоновом режиме.
Файлы можно копировать на другие носители тоже в фоновом режиме
Web-браузеры способны взаимодействовать с серверами в фоновом режиме Благодаря этому пользователь может перейти на другой Web-узел, не дожидаясь, когда будут получены результаты с текущего Web-узла.
Одна важная вещь, на которую Вы должны были обратить внимание во всех этих примерах, заключается в том, что поддержка многопоточности позволяет упростить пользовательский интерфейс приложения. Если компилятор ведет сборку Вашей программы в те моменты, когда Вы делаете паузы в наборе ее текста, отпадает необходимость в командах меню Build. То же самое относится к командам Check Spelling и Check Grammar в текстовых процессорах.
В примере с Web-браузером выделение ввода-вывода (сетевого, файлового или какого-то другого) в отдельный поток обеспечивает "отзывчивость" пользовательского интерфейса приложения даже при интенсивной передаче данных. Вообразите приложение, которое сортирует записи в базе данных, печатает документ или копирует файлы. Возложив любую из этих задач, так или иначе связанных с вводом-выводом, на отдельный поток, пользователь может по-прежнему работать с интерфейсом приложения и при необходимости отменить операцию, выполняемую в фоновом режиме.
Многопоточное приложение легче масштабируется. Как Вы увидите в следующей главе, каждый поток можно закрепить за определенным процессором. Так что, если в Вашем компьютере имеется два процессора, а в приложении — два потока, оба процессора будут при деле. И фактически Вы сможете выполнять две задачи одновременно.
В каждом процессе есть хотя бы один поток. Даже не делая ничего особенного в приложении, Вы уже выигрываете только от того, что оно выполняется в многопоточной операционной системе. Например, Вы можете собирать программу и одновременно пользоваться текстовым процессором (довольно часто я так и работаю). Если в компьютере установлено два процессора, то сборка выполняется на одном из них, а документ обрабатывается на другом. Иначе говоря, какого-либо падения производительности не наблюдается. И кроме того, если компилятор из-за той или иной ошибки входит в бесконечный цикл, на остальных процессах это никак не отражается. (Конечно, о программах для MS-DOS и 16-разрядной Windows речь не идет)
Убедительна просьба прочитать, особенно Tady, чтобы не было таких ответов, как -- Hub прекрасно справляется
------------ Дoбавленo:
Хорошо. Кто-то говоил про Hub. Вот схема, попробуйте ее реализовать на штатных компонентах с тем же алгоритмом, но без штатного системного потока
Add(MainForm,2953706,196,140)
{
Width=270
Height=190
Caption="MutexThread"
Position=1
}
Add(MutexThread,6103994,280,203)
{
Delay=100
FastStop=0
Mutex=0
Point(onWaitqueue)
link(onExec,3213857:doEvent1,[])
}
Add(MutexThread,14180194,280,259)
{
Delay=200
FastStop=0
Mutex=0
Point(onWaitqueue)
link(onExec,13360038:doEvent1,[])
link(onWaitSyncExec,4167202:doEvent1,[(334,279)(334,419)])
link(onWaitqueue,1906094:doData,[])
}
Add(Hub,13476216,196,182)
{
OutCount=10
link(onEvent1,10352990:doWork1,[(718,188)])
link(onEvent2,4016663:doWork1,[(711,195)])
link(onEvent3,9395975:doWork1,[(704,202)])
link(onEvent4,6103994:doStart,[])
link(onEvent5,5884024:doWork1,[(529,216)])
link(onEvent6,10687228:doWork1,[(522,223)])
link(onEvent7,5129674:doReset,[(244,230)(244,405)])
link(onEvent8,13030052:doWork1,[(697,237)])
link(onEvent9,14180194:doStart,[(263,244)(263,265)])
link(onEvent10,11105796:doStart,[(254,251)(254,335)])
}
Add(For,9992035,455,210)
{
End=10000000
IncludeEnd=1
link(onStop,10352990:doWork2,[])
link(End,772898:Var2,[])
}
Add(DoData,15494780,651,266)
{
Data=String(Данные свободны)
link(onEventData,4016663:doWork2,[])
}
Add(Hub,13360038,350,259)
{
OutCount=7
link(onEvent1,10223670:doWork2,[])
link(onEvent2,15494780:doData,[])
link(onEvent3,9398710:doData,[])
link(onEvent4,15544477:doData,[(398,286)(398,146)])
link(onEvent5,14428526:doWork3,[(417,293)])
link(onEvent6,6363910:doOff,[(398,300)(398,426)])
link(onEvent7,4040667:doWork2,[])
}
Add(Label,9439531,735,266)
{
Left=140
Top=35
Width=100
Height=20
Caption=""
AutoSize=1
Alignment=2
}
Add(Label,13424949,735,329)
{
Left=140
Top=60
Width=100
Height=20
Caption=""
AutoSize=1
Alignment=2
}
Add(MutexThread,11105796,280,329)
{
Delay=400
Mutex=0
Point(onWaitqueue)
link(onExec,7382349:doEvent1,[])
link(onSyncExec,13444645:doWork1,[(326,342)])
link(onWaitSyncExec,13444645:doWork2,[])
link(onWaitqueue,7758305:doData,[(339,356)(339,370)])
}
Add(DoData,3806030,651,329)
{
Data=String(Данные свободны)
link(onEventData,9395975:doWork2,[])
}
Add(Hub,7382349,350,329)
{
OutCount=4
link(onEvent1,3806030:doData,[])
link(onEvent2,5920852:doData,[])
link(onEvent3,5129674:doNext,[(412,349)(412,391)])
link(onEvent4,4040667:doWork3,[(403,356)])
}
Add(HubEx,14428526,413,203)
{
link(onEvent,9992035:doFor,[])
}
Add(Memory,12982967,462,140)
{
Default=Integer(50000000)
}
Add(DoData,15544477,413,140)
{
Data=Integer(70000000)
link(onEventData,12982967:doValue,[])
}
Add(Edit,11065380,735,217)
{
Left=10
Top=10
Width=100
TabOrder=-1
Text=""
ReadOnly=0
}
Add(Edit,3908904,553,273)
{
Left=10
Top=35
Width=100
TabOrder=-1
Text=""
ReadOnly=0
}
Add(Edit,4272933,539,336)
{
Left=10
Top=60
Width=100
TabOrder=-1
Text=""
ReadOnly=0
}
Add(Label,15754415,735,385)
{
Left=35
Top=85
Width=45
Height=17
Caption=""
AutoSize=1
Alignment=2
}
Add(Counter,5129674,539,385)
{
Max=1000000000
link(onNext,13030052:doWork2,[])
}
Add(DoData,1906094,602,280)
{
Data=String(Ожидание)
link(onEventData,4016663:doWork3,[(711,286)])
}
Add(HubEx,4016663,707,259)
{
link(onEvent,9439531:doText,[])
}
Add(DoData,7758305,602,364)
{
Data=String(Ожидание)
link(onEventData,9395975:doWork3,[(704,370)])
}
Add(HubEx,9395975,700,322)
{
link(onEvent,13424949:doText,[])
}
Add(Button,9108706,140,182)
{
Left=110
Top=130
TabOrder=-1
Caption="Start"
Data=String()
link(onClick,13476216:doEvent1,[])
}
Add(HubEx,10352990,714,210)
{
link(onEvent,11065380:doText,[])
}
Add(HubEx,5884024,525,266)
{
link(onEvent,3908904:doText,[])
}
Add(HubEx,10687228,518,329)
{
link(onEvent,4272933:doText,[])
}
Add(HubEx,13030052,693,378)
{
link(onEvent,15754415:doText,[])
}
Add(DoData,5920852,455,336)
{
link(onEventData,10687228:doWork2,[])
link(Data,3714444:Var2,[])
}
Add(DoData,9398710,476,273)
{
link(onEventData,5884024:doWork2,[])
link(Data,13800352:Var3,[(482,254)])
}
Add(GetDataEx,13800352,448,245)
{
link(Data,9992035:Position,[])
}
Add(LED,6363910,413,413)
{
Left=115
Top=35
Width=20
Height=20
ColorBlick=255
}
Add(LED,5757834,413,455)
{
Left=115
Top=60
Width=20
Height=20
ColorBlick=255
}
Add(Application,13265532,413,301)
{
Wait=1
}
Add(HubEx,4040667,399,294)
{
link(onEvent,13265532:doProcessMessages,[])
}
Add(HubEx,13444645,322,336)
{
Angle=1
link(onEvent,2528035:doEvent1,[(326,461)])
}
Add(ProgressBar,8803412,735,455)
{
Left=10
Top=110
Width=240
Height=15
Point(doMax)
}
Add(Hub,3213857,350,203)
{
link(onEvent1,10223670:doWork1,[(452,209)])
link(onEvent2,14428526:doWork2,[])
}
Add(DoData,9712022,539,462)
{
link(onEventData,13712720:doEvent1,[])
link(Data,772898:Var3,[(545,191)])
}
Add(GetDataEx,772898,455,182)
{
link(Data,12982967:Value,[])
}
Add(HubEx,10223670,448,252)
{
Angle=1
link(onEvent,9712022:doData,[(452,468)])
}
Add(DoData,11494460,497,455)
{
link(onEventData,14287632:doWork2,[])
link(Data,3714444:Var3,[(503,310)])
}
Add(GetDataEx,3714444,448,301)
{
link(Data,13800352:Var2,[])
}
Add(Hub,4167202,357,413)
{
link(onEvent1,6363910:doChangeValue,[])
link(onEvent2,13745052:doWork1,[(473,426)])
}
Add(Hub,2528035,357,455)
{
link(onEvent1,5757834:doChangeValue,[])
link(onEvent2,13745052:doWork2,[(429,468)(429,461)])
}
Add(HubEx,13745052,469,448)
{
link(onEvent,11494460:doData,[])
}
Add(Hub,13712720,588,462)
{
link(onEvent1,8803412:doMax,[])
link(onEvent2,4088408:doData,[])
}
Add(DoData,4088408,637,469)
{
Data=Integer(0)
link(onEventData,14287632:doWork3,[(683,475)])
}
Add(HubEx,14287632,679,448)
{
link(onEvent,8803412:doPosition,[])
}