|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
|||||||
Многопоточность, _beginthreadex, ошибка ntdll.dll28.10.2016, 00:26. Показов 7459. Ответов 70
Метки нет (Все метки)
Здравствуйте, собственно сабж.
Посмотрите пожалуйста комментарии в коде. Как исправить ситуацию, не правильно запускаются потоки?
0
|
|||||||
| 28.10.2016, 00:26 | |
|
Ответы с готовыми решениями:
70
Вызвано исключение по адресу 0x772C09D6 (ntdll.dll)
При запуске своей проги на Windows 7, ругается на ntdll.dll |
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
|
|||||||
| 03.11.2016, 07:58 | |||||||
|
Как-то, так:
1
|
|||||||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||
| 03.11.2016, 09:46 [ТС] | ||
|
Поэтому такое извращение и делаю, может быть и не правильно но со своей колокольни видится именно так. Спасибо за помощь, попробую поизголяться. Вообще делать поток detach, не хотелось совершенно, желание было нормально завершать потоки через Join. В принципе и в моем кривом коде если включить detach, то вроде бы все работает нормально. Но мне не нравится, вообще нет никакого даже мнимого контроля за потоком тогда. Если я правильно понимаю Max Dark, то нужно делать нормальный деструктор, чтоб не было проблем. НО пока я не догоняю как именно это сделать...попробую поковырять, если не получится, опять буду просить о помощи.
0
|
||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
|
|
| 03.11.2016, 18:21 | |
Сообщение было отмечено gru74ik как решение
Решение
lostandleft, проблема в том, что ты пытаешься совместить вещи из разных областей: объект из WinAPI и уеравление им через потоки и методы С++. Если уж MessageBox, то и реализуй это через потоки и методы WinAPI (как ты сначала и пытался это делать), если потоки С++, то без объектов и методов из WinAPI.
Или используй другие инструменты, в которых есть возможность работы с потоками (типа Qt, в котором есть и свои MessageBox и свои потоки, и, поэтому, там проблем совместимости не будет).
1
|
|
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
|||
| 03.11.2016, 22:27 [ТС] | |||
|
WaitForSingleObjects не работает так как надо - Это вообще не многопоточность, не понимаю для кого или для чего это сделано, какое-то псевдомногопоточие, пока не дождется окончания работы одного потока не запускается другой, бред. Аналогично std::async, те же яйца только в профиль, проблема та-же самая. Только нормальные нативные threds более менее работают. И в общем то проблему уже почти решил, через часик код выложу, для ознакомления, может критика будет. Да, кстати nd2, твой вариант кода тоже с ошибкой выплевывается, как ни крути.
0
|
|||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
|
|||
| 03.11.2016, 22:41 | |||
|
Добавлено через 3 минуты
0
|
|||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
|||||||
| 04.11.2016, 01:16 [ТС] | |||||||
|
Написал же уже трижды, что проблему решить не могу стандартными средвами. Если подсказать не можешь как решить, не нужно меня определять по темам. Я эту уже начал, мне тут удобнее постить. Сейчас код закончу опубликую, может кому пригодится. Повторюсь, решение нашел, будет желание его (решение) унизить, буду рад посмотреть. Но пока что вроде бы как работает все сносно и именно так как нужно. Добавлено через 2 часа 27 минут И так, парни я решил все, есть подозрения что Max Dark, увидел все косяки еще вчера, и причину появления ошибки, и как её решить, но почему-то не подсказал и заставил меня ковыряться самостоятельно...ну нет худа без добра, разобрался от части. Сделал в общем как мне кажется нормальное решение. Конечно код очень косноязычен, и если кто-то пожелает сделать его более читаемым, обернет в классы и как-то улучшит буду очень рад и признателен. Но и на данный момент оно работает от части так, как нужно. Все равно вылетает ошибка если запускать безумное количество потоков, больше 500, при чем ошибка вылетает если обильно тыкать на ОК очень часто в сообщениях. При этом ошибку поймать у меня в дебагере не получается студия предлагает только дезасемблированный вариант кода, который для меня более чем непонятен. При запуске относительно разумного числа потоков все работает нормально. Ну, или на ОК не тыкать то тоже все работает без проблем. Могу предположить что где-то потоки используют таки общие ресурсы, а где найти не могу. Но алгоритм вкратце работает так: Каждый поток после запуска делает запись в вектор своего ID. Дальше после того, как поток закончил свои действия он удаляет из вектора свой ID. Основная функция проверяет наличие ID в векторе и если находит, то терминирует процесс, если же нет, то нормально удаляет его через join. Детальный код с из-лишними комментариями ниже:
0
|
|||||||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||||||
| 05.11.2016, 01:37 [ТС] | ||||||
|
Итак!!! Господа, я сделал это наконец, любое количество потоков отрабатывается на УРА!!! Никаких ошибок не ловлю. Готовый сырец ниже, ОГРОМНАЯ ПРОСЬБА, если кому-то не будет лень, пожалуйста приведите все это к нормальному виду, может быть в класс обернуть это, я все что мог сделал чтоб это работало, а вот с классами и структурами у меня плоховато пока что, увы .Осталась одна не ясность, мне ужасно не понятна ситуация при которой в коде при закомментированной одной строке все идет на смарку. Обычный COUT если его закоментить - FATAL ERROR, который не поддается никакому пониманию, ошибка в дебагере подается только в дезассемблированном виде. Я искренне не понимаю почему так происходит. По мере решения задачки появлялось куча проблем с вектором, где я только мютексы не пихал все бесполезно было, пришлось помимо них еще булевы закидать. Но все работает, я чуть ежиков не выродил, но оно работает без ошибок!!! В общем результат есть, я в целом доволен. Все работает без проблем. Запускал по 500 потоков более чем 20 раз, ни одной ошибки не вылетело. Все было отлично. Еще раз просьбы: 1 - Если возможно посмотрите пожалуйста опытным взглядом на суть ошибки которая вылазит если закоментить один единственный COUT 2 - И, пожалуйста, приведите код к красивому виду, конечно оно работает, но не выглядит.
0
|
||||||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||||||
| 07.11.2016, 12:00 [ТС] | ||||||
|
Все окончательный вариант, ошибку нашел, никакие COUT больше не нужны.
Добавил еще пару флагов для проверки, пару переменных сделал atomic. Запускал от 300 до 1000 потоков, с 10 раз, ни разу ошибку не выплюнуло. Может кому-нибудь пригодится. Код ниже. ...все ежиков отлюбил.
0
|
||||||
|
|
|||||||
| 07.11.2016, 16:21 | |||||||
Идея использовать TerminateThread()- плохая идея, это грубый способ, в некоторых случаях могут быть проблемы с освобождением ресурсов - утечки.
1
|
|||||||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
|||||||
| 07.11.2016, 20:43 [ТС] | |||||||
|
Но вот как оказалось, майкросовтовские функции не допилены до конца. Попробуйте запустить код ниже, и нажимать кнопку ОК раз в секунду, через 40-60 нажатий, отпустите и дайте потокам завершаться так, как мы хотели бы это видеть...к удивлению ничего не произойдет, все буде просто висеть. Все не так просто как может показаться, если Вам не лень запустите и убедитесь самостоятельно, я запускал 5 раз, ни разу программа не завершилась так, как должна была. Мой вариант, тот что кривой в перемешку с атомиками мутексами и флагами, отрабатывает на ура. Возможно я не до конца понимаю весь механизм, и гдето сделал массу ошибок, кроме того, у меня все уродлево и не красиво, не оформлено в функции и классы...но оно работает, повторюсь запускал от 500 до 1000 потоков с 10 раз, всегда все отрабатывается четко, ошибок нет. И программа завершается так, как задумано по таймеру. Этот же код, оформленный в Вашем стиле, предложенном ранее, не отрабатывает:
0
|
|||||||
|
Ушел с форума
|
||
| 07.11.2016, 20:53 | ||
|
А то запуск многих сотен потоков, а затем утверждение о том, что WinAPI-функции "не допилены" - это все выглядит очень странно. У меня все работает, как говорится.
0
|
||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||||
| 07.11.2016, 21:12 [ТС] | ||||
|
В этой функции просто
Никакой параллельной работы тут нет, и не пахнет. Пока не отработает первый Wait не начнет работать второй, и так далее. Поэтому программа висит. В итоге имеем то, что имеем, если запускать через WaitForMultObj от вываливается ошибка, обозначенная в заголовке темы. В общем вопрос я не смог решить стандартными механизмами...может быть просто не дошел до этого. Добавлено через 1 минуту В моем примере все потоки закрываются через таймаут, что и нужно сделать. Все потоки должны закрыться по таймауту. Добавлено через 15 минут Утверждение то, что конкретный мелкий пример я реализовать так и не смог, возможно просто не до конца разобрался во всех возможностях. Поэтому пришлось делать велосипед, на нативных потоках, частично спионерен с гугла, и значительно поперепилен мною уже самостоятельно, но все работает, и вроде бы без проблем.
0
|
||||
|
Ушел с форума
|
||
| 07.11.2016, 21:23 | ||
|
объектов одновременно. Максимум 64. Если ты хочешь преодолеть это ограничение, то нужно или использовать другую технику (например, счетчик + event), или использовать RegisterWaitForSingleObject, или переписать свое приложение как-то иначе. Например, под порты завершения или другие механизмы, у которых таких ограничений нет.
1
|
||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||
| 07.11.2016, 21:30 [ТС] | ||
|
Почему в мой код никто вникать не хочет...или хотябы запустить чтобы проверить, что все ОК. Одна критика ...далеко не всегда конструктивная. Хотя стараюсь прислушиваться, спасибо и за неё.
0
|
||
|
|
||
| 07.11.2016, 21:32 | ||
|
lostandleft,
1. Начнем с того что стоит определится какой инструментарий используете, std или WinApi лучше ограничится чем то одним, я бы предпочел WinApi если нет необходимости в портируемости. 2. Думаю пихать в потоки MessageBox() плохая идея. 3.
0
|
||
|
Ушел с форума
|
||||||
| 07.11.2016, 21:38 | ||||||
|
lostandleft, твой код переусложнен. Лично для меня он почти нечитаемый.
Поэтому я воздержусь от какой-либо критики и т.п. Я просто не могу, глядя на этот код, сказать, корректен он или нет. Но знаю, что после TerminateThread, например, нет абсолютно никакой гарантии, что твое приложение будет корректно завершено. На WinAPI я бы написал как-то так (упрощенно):
1
|
||||||
|
|
||
| 07.11.2016, 21:39 | ||
|
4.
Кстати если создавать > 1000 потоков, то еще может быть так что и памяти под них не хватать будет.
0
|
||
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
|||
| 07.11.2016, 21:42 [ТС] | |||
|
Имитация работает так, на каком то этапе происходит сбой и код не завершается. Т.е. Если мы ОК не нажимаем, то соответсвенно код не продолжается далее. Если нажимаем, то код в потоке выполняется далее. И в том, и в другом случае у нас есть таймаут, мы не можем ждать больше 15 секунд к примеру. В моем примере, в последнем, в том который работает, так как нужно. Потоки закрываются по terminate исключительно в аварийном режиме в случае, если код выполнился до конца до того времени как происходит таймаут, то поток закрывается стандартно по Join. Кстати, на сколько я понял тот же самый WaitForSingleObject, он отрабатывает все тот же вариант Terminate, если уходит таймаут. Другого способа закрыть поток, я так понял, не существует в принципе. поэтому с технической точки зрения, я вроде бы как поступаю правильно. Если код выполняется за период таймаута, то я закрывают потоки через Join иначе терминирую их.
0
|
|||
|
704 / 109 / 21
Регистрация: 22.06.2014
Сообщений: 241
|
|
| 07.11.2016, 21:43 | |
|
lostandleft, когда у вас долго что-либо не получается, почитайте наконец мануалы. Древняя, как говно мамонта книга Джеффри Рихтера вам поможет. Вот конкретная глава.
1
|
|
|
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 114
|
||||
| 07.11.2016, 21:46 [ТС] | ||||
![]() ![]() Ну я же старался комментарии везде писать, как только возможно и переменные обозваны очень и очень вдумчиво, чтобы понятно все было ![]() И повторюсь это аварийное завершение, в случае если таймер не вышел из счета, никакой терминации нет, все через Join.
0
|
||||
| 07.11.2016, 21:46 | |
|
Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 Необработанное исключение по адресу 0x0000000077651DA0 (ntdll.dll) в ProjecktExperement2.exe: 0xC0000005: нарушение прав
Ошибка ntdll.dll Wine - Ошибка ntdll.dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|