Адская_Капча писал(а):Ассемблерные вставки формирую во время процедуры инициализации (самая первая выполняющаяся в программе процедура), сохраняя в массив указатели на них, а уж потом их использую. Разве нельзя сделать по аналогии?
Какой смысл патчить уже готовую DLL на лету, добавляя туда нужную функцию, если кроме твоей программы никто не в курсе об этой функции и не сможет ей пользоваться. Да и твоя программа — только через вызов по указателю. Ну тогда вместо того, что писать генератор ассемблерной вставки, напиши обычную функцию в рамках своего проекта, которая сделает всё то же, что должна делать генерируемая ассемблерная вставка. То есть, если ты такой крутой, что можешь с помощью одного лишь пинцета построить и собрать станок по наливанию воды в пластиковые стаканчики, не проще ли просто самому взять и налить воду в пластиковый стаканчик?
Адская_Капча писал(а):А она, значит, должна появляться непременно посредством вызова из DLL? Я к тому, чтобы не делать свою DLL, а просто воспользоваться сишным рантаймом, а в самой программе уже "доделать" всё недостающее.
Она должна появиться — это главное. И только рантайм знает, как её правильно заполнять. Альтернативно — человек, разобравшийся в устройстве рантайма, тоже может знать как её сформировать. А сишный рантайм не знает о ней ничего. Так что он тут никаким боком не сдался вообще.
Адская_Капча писал(а):А формирование и использование ассемблерных вставок к ним относится?
Ты вообще не понимаешь, о чём там шла речь. Там речь шла о некоей парадигме, что VB предлагает программисту безопасную песочницу для мунипулирования с данными. Где все проблемы превращаются в ошибки, которые можно обработать с помощью
On Error Goto или
On Error Resume. И что в номер программисту никогда не придётся иметь дело с крэшем, если только он не пользовался какими-то грязными трюками. Какими угодно, к многопоточности эта мысль вообще никак не относилась.
Адская_Капча писал(а):Разве еще есть кто-то, кто использует рантайм 5-й версии? А что касается 6-го - неужели они тоже встречаются разные и функции могут лежать в разных местах?
Их полно, и они отличаются не только расположением функций, но и тем, что в разных версиях в разные структуры были добавлены новые поля, поэтому все смещения всех полей в разных версиях рантайма тоже отличаются:
- vb_rt_versions.png (11.87 Кб) Просмотров: 11531
Хочу заметить, что это только промежуточные версии, которые удалось насобирать мне — и между этими билдами тоже были билды, и возможно они тоже были опубликованы и где-то у кого-то работают. Кстати, обращаюсь
ко всем: если у вас есть рантаймы с версиями не из этого списка — отправляйте мне (любым способом свяжитесь со мной).
Адская_Капча писал(а):Можно ли к нему как-то подобраться или получить его в VB? Если не главного, то дополнительного потока. Может, тогда отпадает необходимость создавать таймеры?
Ты можешь написать свой собственный цикл и крутить его, если хочешь. У дополнительного потока — а с чего ты вообще взял, что дополнительный поток его крутит? Необходимость в таймерах тогда совершенно не отпадёт.
Да будет тебе известно, что цикл сообщений, это цикл, который, если отбросить лишнее, «бесконечно» выполняет две функции:
- Код: Выделить всё
Dim msg as STRUCT_MSG
Do While GetMessage(msg, 0, 0, 0) <> 0
DispatchMessage msg
Loop
При этом каждый вызов GetMessage возвращает очередное сообщение из очереди сообщений, а каждый вызов DispatchMessage находит окно, которому предназначалось сообщение и вызывает WindowProc этого окна, передавая данные сообщения. При этом
если сообщений в очереди нет, то функция GetMessage
замораживает текущий поток до момента, когда хоть одно новое сообщение появится в очереди. Как появится — она его вернёт, и потом вернёт следующее (если к тому времени она там будет), и так она вернётся все сообщения, и как только их там снова не окажется, она снова заснёт до лучших времён. То есть она работает
подобно Sleep (или, это будет куда лучшей аналогией, — подобно WaitForSingleObject, но есть подозрение, что ты не в курсе об этой функции и этом механизме), только вместо таймаута в секундах для пробуждения использует факт получения нового сообщения потоком.
Так что цикл прокачки сообщений не крутится постоянно, а крутится только пока есть сообщения для обработки. И поэтому в Windows будь у тебя хоть 250 процессов — у них 99 процентов времени их GUI-потоки тупо спят и вообще не выполняются, поэтому система обеспечивает нормальную скорость работы, и загрузка процессора, отображаемая в диспетчере задач — далека от 100%.
Так что идея отмерять какие-то интервалы в цикле прокачки сообщений — несостоятельна.
"Просабклассить hwnd" - разве это не попытка подобраться к циклу сообщений, или это вовсе не он?
Нет, это не попытка.
Адская_Капча писал(а):Мне еще нужно умудриться найти этот самый момент... А отладка P-кода и поиск чего-либо в нем - это просто кошмар на улице Вязов. Все-таки мне хотелось, чтобы таймер работал и в режиме IDE.
Вообще-то я говорил про отладку скомпилированного проекта, причём скомпилированного в Native-код, потому что целью отладки должно быть узнавание контекста, в котором вызывает callback-процедура системным механизмом. А для этого не важно, отлаживаем мы скомпилированный проект или среду разработчик — системный механизм работает и там и там одинаково.
Но если на секунду подумать об отладке P-кода, работающего в рамках IDE, то и тут нет ничего сложного и кошмарного. Пишешь в Immediate Pane примерно что-то вроде
? Hex(AddressOf MyTimerCallBack), получаешь в ответ адрес, подключаешься отладчиком к IDE, прокручиваешься до этого адреса и ставишь там брекпоинт. Всё.
Адская_Капча писал(а):Неименованные мьютексы?
Ты написал первое, что пришло в голову, или единственное, что знал? Причём тут мьютексы? Их задача — обеспечить, чтобы к некоему защищаемому ресурсу в любой момент времени только один объект мог получать доступ. Это просто одноместный семафор. Ну и к чему это тут?
Тебе нужно из дополнительного потока просигнализировать в главный поток, что момент «икс» настал. Использовать для этого можно Events или вообще флаговую переменную, работать с которой нужно будет Interlocked-функциями.
И всё равно, ты не определился. Чем у тебя занимается код в момент, когда его должно прервать срабатывание таймера? Как на уровне кода должно выглядеть это прерывание? А вместо этих важных моментах ты говоришь о каких-то ассемблерных вставках и сабклассинге. Совершенно мимо кассы.