|
|
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
Подскажите как и можно ли запустить два цикла одновременно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 10:59:24 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
конечно можно, два отдельных потока, в каждом свой цикл ------------------ Best regards, _bob ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 11:23:56 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
_bobконечно можно, два отдельных потока, в каждом свой цикл Только в VB6 нельзя написать нормальное многопотоковое приложение. В интернете ходят примеры с API и таймерами, но использовать их не советую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 12:04:28 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
а я не советую ругать то, чего не знаете я утверждаю: написать нормальное, устойчиво работающее многопоточное приложение на VB6 МОЖНО, т.к. я такое делал и оно прекрасно работает (причем в о-о-очень серьёзной компании), см. соседний топик про copymemory, я там как раз вчера про многопоточный бейсиковый NTService писал ------------------ Best regards, _bob ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 14:13:11 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
_bobа я не советую ругать то, чего не знаете я утверждаю: написать нормальное, устойчиво работающее многопоточное приложение на VB6 МОЖНО, т.к. я такое делал и оно прекрасно работает (причем в о-о-очень серьёзной компании), см. соседний топик про copymemory, я там как раз вчера про многопоточный бейсиковый NTService писал Это означает лишь, что лично вы сделали некую вещь, которая где-то хорошо работает. Ну и ? По написанию многопоточных приложений в VB есть хорошая статья : A Thread to Visual Basic: Multi-Threading In VB5 and VB6 Первая же фраза в ней выделана большим шрифтом: Just because you can do something, doesn't always mean that you should Если лень читать все, прочитайте сразу же conclusion, касающийся VB6 http://www.freevbcode.com/ShowCode.Asp?ID=1287#ConclusionSigh... It seems that many readers missed my original point. The ideas was not to encourage VB programmers to use CreateThread with Visual Basic. It was to explain clearly and accurately why you shouldn't use CreateThread with Visual Basic. So, when Visual Basic 6 turned out to be considerably less thread-safe than VB5, breaking the sample programs referenced by this article, what could I do? I suppose I could go back and revise the samples and try to make them work with VB6. But then the same problem might arise with later versions of Visual Basic as well. Visual Basic offers good support of multithreading including multithreaded clients in ActiveX servers (this is described quite thoroughly in the latest edition of my Developing COM/ActiveX components book). I strongly encourage you to stay within the rules defined by the Visual Basic documentation and not use the CreateThread API with Visual Basic. For those who insist on pursuing CreateThread further, to start with you should eliminate all Declare statements and use a type library instead. I don't promise that this will fix the problem, but my initial testing indicates that it is a necessary first step Там же есть и примеры многопоточных программ, если интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 14:49:44 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinov в VB6 нельзя написать нормальное многопотоковое приложение я понимаю слово нельзя так: попытка сделать то, что нельзя, в подавляющем большинстве случаев приводит к неудаче (нельзя съесть мешок брюквы одному человеку за два часа) Alexey Kudinov Это означает лишь, что лично вы сделали некую вещь, которая где-то хорошо работает. Ну и ? это означает именно то, что факт стабильной работы многопоточного приложения на VB опровергает ваше ошибочное утверждение, будто этого сделать нельзя (если кому-то удастся проделать трюк с мешком брюквы, это будет означать, что я неправ, невзирая ни на мое личное мнение, ни на статистические данные всех вместе взятых докторов и диетологов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 16:02:40 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
_bob Alexey Kudinov в VB6 нельзя написать нормальное многопотоковое приложение я понимаю слово нельзя так: попытка сделать то, что нельзя, в подавляющем большинстве случаев приводит к неудаче Абсолютно согласен. Ok, переформулирую свою точку зрения используя ваше же определение: Попытка в VB6 написать многопотоковое приложение в подавляющем большинстве случаев приводит к неудаче. Так пожалуй будет более точно, хотя можно еще подискутировать над словом "неудача", т.к. четких критериев нет. Скажем приложение, стабильно работающее на одной машине, сконфигурированной определенным образом, плохо и нестабильно работает на другой - это неудача ? А если приложение и должно работать только на одной определенной машине ? За сим предлагаю закончить дискуссию, зафиксировав следующее: Свое мнение я озвучил выше. Оно подкреплено некоторым личным опытом и статьей, ссылку на которую я тоже привел. Мнение _bob , если я правильно понял, состоит в том, что на VB6 можно написать стабильно работающее многопоточное приложение . Это мнение подкреплено тем, что _bob , по его словам, написал такое приложение. Я думаю автор треда сам решит как ему поступить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 16:37:28 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
_bob если Вас не затруднит подкинте пожалуйста небольльшой кусочек кода для многопотокового приложения с небольшими обяснениями чтоб я смого разобратся. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 17:05:49 |
|
||
|
Обработка двух процесов одновременно
|
|||
|---|---|---|---|
|
#18+
вот "облегченная версия" двухпоточного сервиса, main работает в одном потоке (как раз цикл крутит и в процедуре timer выполняет функционал), во втором потоке работает обработчик сервисных сообщений windows и остальной сервисный функционал, оба потока работают независимо друг от друга, в обоих потоках ведется работа с БД, тормоза в одном потоке не влияют на другой, незадекларенные api-фукции необходимо описать в библиотеке типов или скачать из инета библиотеку типов VB-friendly NT Service API Functions (NTVBSvc.tlb) и подключить её к проекту, если в приведённых исходниках убрать закомментарить фукции и процедуры, относящиеся к функционалу (я их не выкладывал), то проект нормально откомпилируется и будет работать (делать, ессно, ничего не будет, только стартовать как сервис и останавливаться) по аналогии можно сделать простое двухпоточное приложение (не сервис), оно так же будет нормально работать много лишних декларов, просто некогда разбираться, что пригодится, что нет, высылаю так Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_WNDPROC = (-4) Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Const WS_POPUP = &H80000000 Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long Private Const WM_DESTROY = &H2 Private Const WM_MS = &H1C Private Declare Function CreatePopupMenu Lib "user32" () As Long 'Private Declare Function InsertMenuItem Lib "user32" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, ByRef lpcMenuItemInfo As MENUITEMINFO) As Long Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As RECT) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Const WM_RBUTTONDOWN = &H204 Private Const WM_RBUTTONUP = &H205 Private Const WM_COMMAND = &H111 Private Const WM_NULL = &H0 Private Const TPM_CENTERALIGN = &H4 Private Const TPM_LEFTALIGN = &H0 Public Type POINTAPI X As Long Y As Long End Type Dim hMenu As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Const MF_STRING = &H0 Public Const SERVICE_NAME = "GKUPr" Public Const INFINITE = -1& Private Const WAIT_TIMEOUT = 258& Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion(1 To 128) As Byte End Type Public Const VER_PLATFORM_WIN32_NT = 2& Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Public hStopEvent As Long, hStartEvent As Long, hStopPendingEvent As Long Public IsNT As Boolean, IsNTService As Boolean Public ServiceName() As Byte, ServiceNamePtr As Long 'Public hMakeHidWnd As Long, hCloseHidWnd As Long 'Public HidWndCreated As Boolean Dim hHookKB As Long 'дескриптор клавиатурного хука 'Dim hHookMO As Long 'дескриптор мышиного хука Dim last_hook_time As Date Dim cTray As TrayIcon Dim cTray_err As TrayIcon Dim BDw As BD_work Dim menu_arr() As String Dim icon_switch As Byte 'это переключатель иконки (какая иконка на экране) при мигании Dim timer_counter As Integer 'cчетчик таймеров при мониторинге 'Dim show_err As Boolean 'показана ошибка или нет Dim tim_reg As Byte 'это режим работы таймера Public m_lnghWnd As Long 'хэндл скрытого окна Public m_lngOldWndProc As Long 'хэндл процедуры окна '***************************************************************** Private Sub Main() On Error Resume Next Dim cntr As Byte Dim hnd As Long 'хэндл сервисного потока Dim hnd2 As Long 'хэндл оконного потока Dim h(0 To 1) As Long 'возвращаемый массив от сервисного потока Dim h2(0 To 1) As Long 'возвращаемый массив от оконного потока ' чтоб не пустили 2 сеанса If App.PrevInstance Then Exit Sub 'last_hook_time = Now 'hHookKB = SetWindowsHookEx(0, AddressOf HookProc, App.hInstance, 0) If Command = "-install" Then If SetNTService() = 0 Then Shell ("net start " & SERVICE__NAME & " /s") Else MessageBox 0&, "Сервис не удалось установить.", "Внимание! Ошибка!", vbCritical Or vbOKOnly Or vbMsgBoxSetForeground End If End ElseIf Command = "-uninstall" Then If DeleteNTService() = 0 Then MessageBox 0&, "Сервис успешно удален.", "Внимание!", vbInformation Or vbOKOnly Or vbMsgBoxSetForeground Else MessageBox 0&, "Сервис не удалось удалить.", "Внимание! Ошибка!", vbCritical Or vbOKOnly Or vbMsgBoxSetForeground End If End End If ' проверка операционки IsNT = CheckIsNT() ' события hStopEvent = CreateEvent(0, 1, 0, vbNullString) hStopPendingEvent = CreateEvent(0, 1, 0, vbNullString) hStartEvent = CreateEvent(0, 1, 0, vbNullString) 'hMakeHidWnd = CreateEvent(0, 1, 0, vbNullString) 'hCloseHidWnd = CreateEvent(0, 1, 0, vbNullString) ServiceName = StrConv(SERVICE_NAME, vbFromUnicode) ServiceNamePtr = VarPtr(ServiceName(LBound(ServiceName))) 'Load ServiceMain If IsNT Then ' пробуем стартануть сервис hnd = StartAsService h(0) = hnd h(1) = hStartEvent ' ждем пока сервис стартанет (1) или обломает со стартом (0) IsNTService = WaitForMultipleObjects(2&, h(0), 0&, INFINITE) = 1& If Not IsNTService Then CloseHandle hnd MessageBox 0&, "Эта программа должна стартовать как сервис.", "Внимание! Ошибка!", vbCritical Or vbOKOnly Or vbMsgBoxSetForeground End If Else MessageBox 0&, "Эта программа только для Windows NT/2000/XP.", "Внимание! Ошибка!", vbCritical Or vbOKOnly Or vbMsgBoxSetForeground End If If IsNTService Then ' ****************** ' тут можно добавить сервисных обьектов ' ****************** Call MakeWnd SetServiceState SERVICE_RUNNING 'App.LogEvent "Сервис стартанул" 'hnd2 = StartHiddenWindow 'h2(0) = hnd2 'h2(1) = hMakeHidWnd 'If WaitForMultipleObjects(2&, h2(0), 0&, INFINITE) = 1& Then tim_reg = 0 cntr = 0 Do ' ****************** ' весь фунционал складывать сюда ' цикл лупится раз в 100 миллисекунд ' ****************** DoEvents If cntr = 10 Then cntr = 0 Timer Else cntr = cntr + 1 End If Loop While WaitForSingleObject(hStopPendingEvent, 100&) = WAIT_TIMEOUT 'End If ' ****************** ' тут те обьекты, которые вверху добавил надо убивать ' ****************** 'UnhookWindowsHookEx hHookKB Call BDw.Write_shutdown Call DestroyMenu(hMenu) If BDw.have_er Then Call cTray_err.Delete End If Call cTray.Delete Call DestroyWindow(m_lnghWnd) SetServiceState SERVICE_STOPPED 'App.LogEvent "Сервис остановился" SetEvent hStopEvent ' ждем остановки сервиса WaitForSingleObject hnd, INFINITE CloseHandle hnd End If CloseHandle hStopEvent CloseHandle hStartEvent CloseHandle hStopPendingEvent End Sub сервисный модуль, работает во втором потоке (обработчики сообщений по возможности убрал) Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long Private ServiceStatus As SERVICE_STATUS Private hServiceStatus As Long ' The FncPtr function returns function pointer. Function FncPtr(ByVal fnp As Long) As Long FncPtr = fnp End Function ' делает Service Dispatcher thread Public Function StartAsService() As Long Dim ThreadId As Long StartAsService = CreateThread(0&, 0&, AddressOf ServiceThread, 0&, 0&, ThreadId) End Function ' стартует сервис ' возвращает управление после остановки сервиса Private Sub ServiceThread(ByVal dummy As Long) Dim ServiceTableEntry As SERVICE_TABLE ServiceTableEntry.lpServiceName = ServiceNamePtr ServiceTableEntry.lpServiceProc = FncPtr(AddressOf ServiceMain) StartServiceCtrlDispatcher ServiceTableEntry End Sub ' основная процедура сервиса ' стартует сервис, ' устанавливает событие hStartEvent, и ждёт hStopEvent, ' когда дожидается, выходит из процедуры и сервис остаавливается Private Sub ServiceMain(ByVal dwArgc As Long, ByVal lpszArgv As Long) ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP _ Or SERVICE_ACCEPT_SHUTDOWN 'ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN ServiceStatus.dwWin32ExitCode = 0& ServiceStatus.dwServiceSpecificExitCode = 0& ServiceStatus.dwCheckPoint = 0& ServiceStatus.dwWaitHint = 0& hServiceStatus = RegisterServiceCtrlHandler(SERVICE_NAME, _ AddressOf Handler) SetServiceState SERVICE_START_PENDING ' устанавливает событие hStartEvent и отпускает основной поток SetEvent hStartEvent ' ждет hStopEvent WaitForSingleObject hStopEvent, INFINITE End Sub ' перехватывает команды сервисного диспетчера ' и генерит сбытие hStopEvent при обработке ' SERVICE_CONTROL_STOP или SERVICE_CONTROL_SHUTDOWN Private Sub Handler(ByVal fdwControl As Long) Select Case fdwControl Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP SetServiceState SERVICE_STOP_PENDING SetEvent hStopPendingEvent Case Else SetServiceState End Select End Sub ' меняет состояние сервиса Public Sub SetServiceState(Optional ByVal NewState As SERVICE_STATE = 0&) If NewState <> 0& Then ServiceStatus.dwCurrentState = NewState SetServiceStatus hServiceStatus, ServiceStatus End Sub ------------------ Best regards, _bob ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 17:44:40 |
|
||
|
|

start [/forum/topic.php?fid=60&fpage=342&tid=2168350]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 315ms |

| 0 / 0 |
