![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
А есть смысл аварийно завершать поток по TerminateThread ??
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
это не мне решать, а разработчику другого приложения, которое использует мою библиотеку а вообще, эту ф-ю лучше не использовать |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
да, очередь есть, но есть один ньюанс ) у меня данные приходят маленькими порциями, а я реализую алгоритм Нагля, что-бы их объединить в большие буферы и записывать каждый такой буфер одним вызовом WriteFile. В очереди лежат именно такие буферы. При добавлении данных в очередь, на самом деле данные дописываются в последний буфер очереди, если он переполнен или его нет, то создается новый буфер и данные записываются в него. То-есть получается примерно так, мне приходит первая порция данных, к пример 100 байт, я создаю буфер и записываю в него эти 100 байт, затем сразу извлекаю этот буфер из очереди и вызываю WriteFile для записи и пока в порт завершения не будет добавлен пакет, сигнализирующий о том, что эти данные записаны, WriteFile вызываться не будет. Все новые данные, которые будут приходить до завершения операции будут добавляться в новый буфер, затем когда он переполнится будет создан еще один и так далее. После того, как операция завершиться я извлеку первый буфер из очереди и начну операцию записи для него. И так далее, пока очередь не опустеет. Если сразу писать все через WriteFile, то получится большой оверхэд, так-как простое дописывание в буфер намного быстрее чем syscall, пусть даже внутри WriteFile эти данные то-же будут только добавлены в очередь. Плюс, будет большая фрагментация, так как в очереди ввода вывода будет очень много очень маленьких элементов, а в очереди порта завершения - очень много указателей на overlapped структуры. Добавлено через 13 минут и 18 секунд В общем, если-бы все данные у меня были-бы сразу, или хотя-бы приходили большими кусками, то я конечно не использовал-бы очередь, но в данном случае так нельзя. Это сообщение отредактировал(а) Lazin - 17.4.2009, 10:45 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
А кто мешает держать один дежурный буфер и дописывать в него по мере прихода данных, пока не сформируется кусок достаточного размера? И только после этого отправлять его в очередь на запись.
Очередь при этом может висеть в отдельном потоке и сбрасывать готовые буфера через синхронный Write. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
поддерживаю, очень хороший вариант, во избежание большой фрагментации тогда поток с синхронной записью не будет стопорить приход новых данных и будет полная гармония -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |