Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26151
Рейтинг: 2127
#16: 2008-12-06 00:24:41 ЛС | профиль | цитата
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,[])
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#17: 2008-12-06 00:28:14 ЛС | профиль | цитата
Прочитал, ну и что ?
- Папа, а првда, что Windows многопоточная ОС ? Как это?
- Правда сынок. Сейчас закончу форматировать дискету и покажу.

nesco писал(а):
А ты в момент цикла пробовал форму двигать
А нафига её двигать???
Хотя прервать, нажав [X] пробовал. Runtime error 204 (помоему)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#18: 2008-12-06 00:34:35 ЛС | профиль | цитата
Tad писал(а):
А нафига её двигать???

Ладно, форму двигать не надо, а вот кнопку на форме нажимать не плохо бы в момент работы цикла.

Неужели ты думаешь, что SQLite не имеет мульти-поточного выполнения запросов к базе

Если ты никогда не сталкивался с применением потоков, это не означает, что они никому не нужны
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#19: 2008-12-06 00:40:09 ЛС | профиль | цитата
Хотя откуда этот RunTime - не разбирался, но компонент вроде не виноват
------------ Дoбавленo:

nesco писал(а):
это не означает, что они никому не нужны
Я что говорил, что это не нужно?
Помоему какраз наоборот
Tad писал(а):
Компонент нужный

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#20: 2008-12-06 00:40:19 ЛС | профиль | цитата
Tad писал(а):
компонент вроде не виноват

Да нет, виноват. Было обращение к удаленному потоку при закрытии в момент выдачи сообщения при ожидании
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#21: 2008-12-06 01:07:54 ЛС | профиль | цитата
OnClose MainForm через Hub подключенный в обратном порядке к точкам do Stop вроде решает проблему
------------ Дoбавленo:

Компонент не виноват - виновата схема.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#22: 2008-12-06 01:11:37 ЛС | профиль | цитата
Tad писал(а):
OnClose MainForm через Hub подключенный в обратном порядке к точкам do Stop вроде решает проблему

Это не решение проблемы. Деструктор должен корректно останавливать потоки сам и ждать их завершения, а не мы это должны делать
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#23: 2008-12-06 01:15:55 ЛС | профиль | цитата
Ну смотри сам - я пошел спать.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Гость
Ответов: 17029
Рейтинг: 0
#24: 2008-12-06 13:18:02 правка | ЛС | профиль | цитата


Редактировалось 5 раз(а), последний 2020-03-01 19:03:28
карма: 0

0
Ответов: 8926
Рейтинг: 823
#25: 2008-12-06 13:25:32 ЛС | профиль | цитата
Tad, как Менделееву во сне привиделось ?
карма: 19

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#26: 2008-12-06 13:37:42 ЛС | профиль | цитата
cbl217-132-246-37.bb.netv писал(а):
что пока For не отработает никакие потоки не сработают

Ну да конечно, а onWiteQueue я что, зря поставил, вот он, как раз, и отрабатывает в ждущих потоках, когда рабоает цикл.

cbl217-132-246-37.bb.netv писал(а):
На.

И что, попробуй подвигать формой индикаторы встанут на месте, к тому же, задержка на отработку сообщений окна тормозит цикл, что не наблюдается в моей схеме, так как цикл работает в своем потоке, а индикатор -- в своем.

Tad, если это ты, то я тебе скажу вот что -- не надо мне доказывать, что верблюд -- это слон. Поди почитай литературу, и не парь мне мозги.

------------ Дoбавленo:


Леонид писал(а):
как Менделееву во сне привиделось ?

И что ему там привиделось -- водка что ли, в 40 градусов
------------ Дoбавленo:

Tad, схема, которую я привел, просто отображает принцип ждущих в очереде потоков, не более того. А я вот, глядя на тебя, понял, что ты не совсем понимаешь принцип мульти-поточной обработки данных.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#27: 2008-12-06 13:48:43 ЛС | профиль | цитата
nesco, Я конечно. И даже в этой схеме могу паралельно писать в RichEdit.
code_10865.txt
Единственное, что не могу это двигать форму. И не доказываю я, что верблюд - это слон.
Компонент нужный, но где его применить практически, честно, не вижу.

Леонид писал(а):
Tad, как Менделееву во сне привиделось ?

Не. Но таблица элементов приснилась сначала Пушкину, а он в ней нихрена не понял
nesco писал(а):
схема, которую я привел, просто отображает принцип ждущих в очереде потоков, не более того. А я вот, глядя на тебя, понял, что ты не совсем понимаешь принцип мульти-поточной обработки данных.
Все потоки подключенные к Hub - ждущие своей очереди. Это и есть принцип поточной обработки, а мульти-поточная обработка - фикция и как говорит классик - лапша на уши.
При одном процессоре нет мульти-поточной обработки данных, есть псевдо-мульти-поточная обработки данных.
Поинтерисуйся, сколько процессоров, работающих только со своими данными в современном самолете. И никаких мульти.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 1code_10865.txt [3.2KB] [350]
Голосовали:Валерий
Разработчик
Ответов: 26151
Рейтинг: 2127
#28: 2008-12-06 13:55:10 ЛС | профиль | цитата
Tad писал(а):
Но таблица элементов приснилась сначала Пушкину

Везет же гениям, такие вещи снятся

Tad писал(а):
но где его применить практически, честно, не вижу

Пока не видищь, наступит время и увидишь.

Я еще за Fiberы не брался, вот где еще конь не валялся


карма: 22

0
Ответов: 16884
Рейтинг: 1239
#29: 2008-12-06 14:11:25 ЛС | профиль | цитата
HI Fiber - напиток с высоким содержанием растительной клетчатки
Очищает кишечник и нормализует деятельность желудочно-кишечного тракта, снижает уровень холестерина в крови, нормализует уровень сахара...
Хорошее дело.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 3655
Рейтинг: 69
#30: 2008-12-06 19:52:29 ЛС | профиль | цитата
Tad писал(а):
Поинтерисуйся, сколько процессоров, работающих только со своими данными в современном самолете. И никаких мульти.
Где то в инете прочитал что в следующем году будут уже 80ти процессорные компы.
Вот это поток
Tad писал(а):
но где его применить практически, честно, не вижу.

Во, и ,я про это для меня мультипоточность это увеличение производительности
в разы,а всё остальное это лишние заморочки.
карма: 0

0
30
Сообщение
...
Прикрепленные файлы
(файлы не залиты)