Кривоус Анатолий писал(а):Все API, вызываемые вне инициализации объявляй в tlb.
100 раз такое на форуме читал, но без какого-либо объяснения. М.б. DllFunctionCall потокозависимая функция? Окай. Кто такие потокозависимые функции? М.б. те, кому нужен TLS.
Jack Ferre писал(а): В таком виде работает только в IDE.
По факту правильно. Но по сути: "Работает только с наличием TLS". Не знаю что такое TLS, но м.б. тот большой красный прямоугольник из картинки про инициализацию контекста? И при создании (не мной) одного и более потоков он таки появляется.
Кривоус Анатолий писал(а):Работает в скомпилированном виде.
Точнее "только в скомпилированном виде". Я нашел почему:
Кривоус Анатолий писал(а):ExitThread 0
В общем случае: зачем такое писать на VB, поток и так вернет 0 при завершении функции. А при необходимости поменять код возврата можно другим способом.
В частном случае: вы убиваете поток при живой ссылке
out. IDE падает из-за попытки её освободить.
Стабильные потоки VB в моём текущем представлении - это отсутствие вызова функции Win API CreateThread.
Но так как альтернативы нет, приходится довольствоваться ей.
Проблемы CreateThread с которыми я сталкивался:
- (Как уже писал) Если одновременно создать более одного дополнительного потока, после закрытия программы IDE упадёт.
- При закрытии программы в IDE, есть шанс падения IDE.
- В зависимости от содержания вызываемой функции есть шанс падения программы.
- В зависимости от содержания вызываемой функции есть шанс падения программы при выходе из потока.
- Наличие этого "шанса". Размытие границы "Это можно! Это нельзя!"
Я ожидал, что при отсутствии строки
CoInitialize ByVal 0& программа упадёт. Так нет - просто неудачное выполнение
CoCreateInstance.
Кривоус Анатолий писал(а): нельзя просто так предавать ссылки на объекты без маршаллинга
Маршаллинг, что это? Почему, если он так важен, без него всё работает?
К тому же в примере ThreadProxy я не передаю ссылку на объект, а только указатель. После (уже в основном потоке) делаю из него ссылку.
Julia.
А чего это она не падает? Фэн-шуй?
Кривоус Анатолий писал(а):Так нельзя создавать потоки. Где инициализация?
Jack Ferre писал(а):Допустим, я не использую CreateThread, но имеется callback-функция, вызываемая из другого (правильно инициализированного) потока.