Модератор: gaidar
Раз плюнутьЗакончив подготовку документа пользователь жмет кнопочку Save, после чего документ должен начать сохранятся в другом потоке, чтобы интерфейс программы не зависал.
...
И еще желательно чтобы многопоточность не приводила к крашам во время отладки в IDE, поскольку проект сложный, повесится можно без нормальной отладки.
Два плюнутьЗатем все остальные программы-клиенты, которые активны в данный момент, должны получить сообщение/событие, что в сетевую папку сохранились некие файлы.
Это ничем не обоснованные эмоции.Что-то мне не нравится вариант с ActiveX EXE
Да.в VB6 это единственный путь?
Antonariy писал(а):[Да.
Там примеры реализации броадкаста. Смотри примеры мессенджеров.Вторая ссылка это что? Там какие-то примеры работы с Audio
Ну если ты считаешь, что это проще...А что если использовать Native DLL из которой создавать отдельный тред, в котором сохранять файл, а после записи файлв вызывать бейсик-CallBack функцию для оповещения о событии конца записи. Это вроде проще должно быть чем ActiveX EXE
Antonariy писал(а):Проще только создать отдельную activex exe, которая будет заниматься лишь сохранением. Но это будет уже отдельный процесс, а не поток.
Antonariy писал(а):Да.в VB6 это единственный путь?
Antonariy писал(а):Это ничем не обоснованные эмоции.Что-то мне не нравится вариант с ActiveX EXE
Dim A As IThreadWorker, B As IThreadWorker, C As IThreadWorker
Set A = New CThreadWorkerFromActivexExe
Set B = New CThreadWorkerFromActivexExe
Set C = New CThreadWorkerFromActivexExe
A.DoAction
B.DoAction
C.DoAction
Первая ссылка чем не пример? Статей никогда не видел, да там и писать собственно не о чем.Есть примеры?
Нет, если обрабатывать ошибки. При чтении нужно ставить соответствующую блокировку, чтобы кто-то не попытался в это время записать.Ситуация крашовая?
Тобой, но не им.Хакер писал(а):Это как раз хорошо обсновованная позиция.
Вопрос в количестве гемороя и "специального кода", который кроме тебя никто не писал. В моем примере всего один многопоточный exe и ни капли соков мозга.Я не знаю, откуда взялась эта тупая идиотия, но ходит убеждение, что ActiveX-EXE способны дать вам многопоточность, а ActiveX-DLL — не способны, поэтому практически никогда не рассматриваются.
Antonariy писал(а):Тобой, но не им.
Antonariy писал(а):Вопрос в количестве гемороя и "специального кода", который кроме тебя никто не писал.
Antonariy писал(а):Ты пример с первой ссылки скачивал вообще, запускал? Что там блокируется?
А, ну да, я уже забыл про это. Блокировка SetJob была очевидна, пришло в голову только создать новое окно с таймером. А overkill в чем? В лишнем окне?Именно этот случай в исходнике
Это не большая проблема, просто этот кусок кода у меня кочует по проектам. Однажды был нужен GetObject, а в этом примере наверное достаточно App.PrevInstance.Чтобы поместить объект в ROT, нужно быть админом.
GetObject решал и эту проблему, при наличии первого инстанса второй просто молча выйдет. А вызову CreateObject для создания потока холостой проход Sub Main никак не мешает.Если запустить два инстанса процесса, то у первого новый потоки будут создаваться в нём же (получается общее АП), а у второго новые потоки будут создаваться в первом (и общего АП не будет).
Хакер писал(а):А долго твой проект будет разрабатываться?
Могу скинуть почти готовую версию, а когда закончишь проект, будет готова и релизная версия кирпича.
P.S. jangle, а ты пробовал использовать Overlapped IO? Может и не нужна многопоточность?
Antonariy писал(а):А, ну да, я уже забыл про это. Блокировка SetJob была очевидна, пришло в голову только создать новое окно с таймером
Antonariy писал(а):А overkill в чем? В лишнем окне?
Antonariy писал(а):Это не большая проблема, просто этот кусок кода у меня кочует по проектам. Однажды был нужен GetObject, а в этом примере наверное достаточно App.PrevInstance.
Antonariy писал(а):GetObject решал и эту проблему, при наличии первого инстанса второй просто молча выйдет. А вызову CreateObject для создания потока холостой проход Sub Main никак не мешает.
Лучше overkill компьютера, чем разработчика Компьютерное время стоит дешевле, а пользователь лишних тактов процессора не почувствует. Эти прибамбасы вредны лишь если потоки создаются и умирают постоянно, а не от случая к случаю.А тут такие гигантские прибамбасы ради того, чтобы получить новый поток.
В проекте, откуда этот блок скопипастен, нужен, значит не проблема, а требование, а здесь не нужен, значит на помойку, и проблемы нет.Это большая проблема
А если нужно приложение реального времени, то WinXP проблема. Не нужно придумывать себе же на голову экзотические условия, которых нет в поставленной задаче, мы тут не универсальный кирпич лепим.Что если нам нужен 3 процесса по 4 потока в каждом?
Antonariy писал(а):Лучше overkill компьютера, чем разработчика Компьютерное время стоит дешевле.
Antonariy писал(а):В проекте, откуда этот блок скопипастен, нужен, значит не проблема, а требование, а здесь не нужен, значит на помойку, и проблемы нет.
Antonariy писал(а):А если нужно приложение реального времени, то WinXP проблема.
Проверил, PrevInstace не работает, но это не значит, что нельзя избавиться от ROT. Из головы вылетело как это называется: создать через API глобальный системный хендл и проверять его наличие. Или порт открыть, если брандмауэр позволит.Ты не понял или я не понял? Помещение в ROT здесь играет ключевую роль, от него нельзя избавиться. Так что проблема остаётся.
5 инстансов приложения Jangle — вот экзотические условия.5 инстансов какого-то процесса — это экзотические условия?
Antonariy писал(а):Проверил, PrevInstace не работает, но это не значит, что нельзя избавиться от ROT. Из головы вылетело как это называется: создать через API глобальный системный хендл и проверять его наличие. Или порт открыть, если брандмауэр позволит.
P.S. jangle, а ты пробовал использовать Overlapped IO? Может и не нужна многопоточность?
Хакер писал(а):Чтобы поместить объект в ROT, нужно быть админом. Я работаю под огр. учёткой, и получаю «Unexpected error. Quiting.» при запуске. Это главная проблема.
jangle писал(а):Так и не смог нагуглить ни одного примера использования Overlapped IO в VB6
GetObject в моем коде вообще не нужен. А использовал я его именно для проверки наличия предыдущего инстанса.GetObject в твоём коде нужен не для этого.
Существует утилита ROTView (точность названия не гарантирую), мое приложение она видела, офис — нет. Либо офис не использует ROT, либо как-то прячется.Не знаю, как насчет админа и ROT. Скорее всего это не так, иначе бы весь VBA и интеграция приложений не работали у офисных пользователей в офисе.
#Compile DLL
#Dim All
#Include Once "Win32API.inc"
Global ghInstance As Dword
Global hThread As Dword
Global gFileName As String
Global gFileContent As String
Global gCallBackFunct As Dword
Declare Function SaveFileThread Alias "SaveFileThread" (ByVal FileName As String, ByVal FileContent As String, ByVal CallBackFunct As Dword) As Dword
Declare Thread Function mThread_Save(ByVal mWnd As Dword) As Dword
Declare Sub CallBackProc()
'-------------------------------------------------------------------------------
' Main DLL entry point called by Windows...
'
Function LibMain (ByVal hInstance As Long, _
ByVal fwdReason As Long, _
ByVal lpvReserved As Long) As Long
Select Case fwdReason
Case %DLL_PROCESS_ATTACH
ghInstance = hInstance
Function = 1 'success!
Case %DLL_PROCESS_DETACH
Function = 1 'success!
Case %DLL_THREAD_ATTACH
Function = 1 'success!
Case %DLL_THREAD_DETACH
Function = 1 'success!
End Select
End Function
'-------------------------------------------------------------------------------
Thread Function mThread_Save(ByVal mWnd As Dword) As Dword
Local lResult As Dword
Local f As Dword
f=FreeFile
Open gFileName For Binary As f
Put$ f,gFileContent
Close f
gFileContent=""
Thread Close hThread To lResult
Call Dword gCallBackFunct Using CallBackProc 'Вызов функции в VB коде для оповещении о конце записи файла
End Function
Function SaveFileThread Alias "SaveFileThread" (ByVal FileName As String, ByVal FileContent As String, ByVal CallBackFunct As Dword) Export As Dword
gFileName=FileName
gFileContent=FileContent
gCallBackFunct=CallBackFunct
Thread Create mThread_Save(0) To hThread
FileContent=""
End Function
Вернуться в Раздел для Профессионалов
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5