Форум программистов, компьютерный форум, киберфорум
The trick
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

"Многооконная" многопоточность VB6

Запись от The trick размещена 29.01.2014 в 00:48
Показов 4966 Комментарии 0
Метки vb

В примере можно в отдельном потоке создать экземпляр окна, рисовать на нем и заморозить, не затрагивая другие потоки. При закрытии основного окна, оно закрывает все окна и ждет завершения всех потоков. Так что если нажать Sleep, то программа будет ждать завершения пока не закончится период ожидания.
Модуль:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
Option Explicit
 
' Модуль для создания окна с циклом обработки сообщений в новом потоке
' © Кривоус Анатолий Анатольевич (The trick), 2014
' Работает только в скомпилированном в Native коде
 
Public Type POINTAPI
    x As Long
    y As Long
End Type
Public Type Msg
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type
Public Type WNDCLASS
    style As Long
    lpfnwndproc As Long
    cbClsextra As Long
    cbWndExtra2 As Long
    hInstance As Long
    hIcon As Long
    hCursor As Long
    hbrBackground As Long
    lpszMenuName As Long
    lpszClassName As String
End Type
 
Public Const INFINITE = &HFFFF
Public Const WS_CHILD = &H40000000
Public Const WS_CLIPCHILDREN = &H2000000
Public Const WS_SYSMENU = &H80000
Public Const CS_VREDRAW = &H1
Public Const CS_HREDRAW = &H2
Public Const CS_CLASSDC = &H40
Public Const WM_DESTROY = &H2
Public Const WM_COMMAND = &H111
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOUSEMOVE = &H200
Public Const WM_CLOSE = &H10
Public Const WM_QUIT = &H12
Public Const WM_SETFONT = &H30
Public Const IDC_ARROW = 32512&
Public Const GWL_WNDPROC = (-4)
Public Const CW_USEDEFAULT = &H80000000
Public Const COLOR_WINDOW = 5
Public Const IDI_APPLICATION = 32512&
Public Const SW_SHOWNORMAL = 1
Public Const MB_ICONEXCLAMATION = &H30&
 
Public hWnds() As Long, Count As Long, RegClass As Long, hMutex As Long, _
       TlsIndex As Long, ClassNameAnsi As String, hInstance As Long, hFont As Long
 
Public Function ThreadProc(ByVal Name As String) As Long
    TlsSetValue TlsIndex, 0                         ' Флаг рисования = 0
    NewWindow Name
End Function
 
Public Function NewWindow(Name As String) As Boolean
    Dim wMsg As Msg
    Dim PntWnd As Long, ButWnd As Long
    
    WaitForSingleObject hMutex, INFINITE        ' Останавливаем пока мьютекс захвачен
    
    If RegClass = False Then
        If Not RegisterWindowClass Then ReleaseMutex hMutex: Exit Function
        RegClass = True
        'MessageBox 0, "Class registered", "test", MB_ICONEXCLAMATION
    End If
    
    PntWnd = CreateWindowEx(0, "TrickWindow", Name, WS_SYSMENU Or WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, 0, 0, App.hInstance, ByVal 0&)
    ButWnd = CreateWindowEx(0, "Button", "Sleep(10000)", WS_CHILD, 150, 175, 100, 50, PntWnd, 1, App.hInstance, ByVal 0&)
 
    SendMessage ButWnd, WM_SETFONT, hFont, 1
    
    Call ShowWindow(PntWnd, SW_SHOWNORMAL)
    Call ShowWindow(ButWnd, SW_SHOWNORMAL)
    
    ReDim Preserve hWnds(Count)
    hWnds(Count) = PntWnd
    Count = Count + 1
    
    ReleaseMutex hMutex                         ' Даем другим потокам создать окна
    
    Do While GetMessage(wMsg, 0&, 0&, 0&)
        Call TranslateMessage(wMsg)
        Call DispatchMessage(wMsg)
    Loop
    
    WaitForSingleObject hMutex, INFINITE        ' Если вдруг окно создается
 
    Count = Count - 1
    
    If Count = 0 Then
        UnregisterClass "TrickWindow", App.hInstance
        RegClass = False
        'MessageBox 0, "Class unregistered", "test", MB_ICONEXCLAMATION
    End If
    
    ReleaseMutex hMutex
End Function
 
Public Function RegisterWindowClass() As Boolean
    Dim wc As WNDCLASS
    
    wc.style = CS_HREDRAW Or CS_VREDRAW Or CS_CLASSDC
    wc.lpfnwndproc = GetAddr(AddressOf WndProc)
    wc.hInstance = hInstance
    wc.hIcon = LoadIcon(0&, IDI_APPLICATION)
    wc.hCursor = LoadCursor(0&, IDC_ARROW)
    wc.hbrBackground = COLOR_WINDOW
    wc.lpszClassName = ClassNameAnsi
    RegisterWindowClass = RegisterClass(wc)
End Function
 
Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim x As Integer, y As Integer, r As Long, dc As Long
    Select Case uMsg&
    Case WM_COMMAND
        If wParam = 1 Then
            Call Sleep_Click
        End If
    Case WM_LBUTTONDOWN
        SetCapture hwnd
        x = lParam And &HFFFF&
        y = (lParam \ &H10000) And &HFFFF&
        TlsSetValue TlsIndex, 1
        dc = GetDC(hwnd)
        MoveToEx dc, x, y, ByVal 0&
        ReleaseDC hwnd, dc
    Case WM_LBUTTONUP
        ReleaseCapture
        TlsSetValue TlsIndex, 0
    Case WM_MOUSEMOVE
        x = lParam And &HFFFF&
        y = (lParam \ &H10000) And &HFFFF&
        r = TlsGetValue(TlsIndex)
        If r = 1 Then
            dc = GetDC(hwnd)
            LineTo dc, x, y
            ReleaseDC hwnd, dc
        End If
    Case WM_DESTROY: Call PostQuitMessage(0&)
    End Select
    
    WndProc = DefWindowProc(hwnd&, uMsg&, wParam&, lParam&)
End Function
Private Sub Sleep_Click()
    Sleep 10000
End Sub
Private Function GetAddr(Addr As Long) As Long
    GetAddr = Addr
End Function
Форма:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
 
' Форма для теста модуля для создания окна с циклом обработки сообщений в новом потоке
' © Кривоус Анатолий Анатольевич (The trick), 2014
' Работает только в скомпилированном в Native коде
 
Dim Threads(100) As Long, Ct As Long
 
Private Sub cmdNewThread_Click()
    Dim hThread As Long, S As String
    
    S = "Thread_" & CStr(Ct + 1)
    hThread = CreateThread(ByVal 0, 0, AddressOf ThreadProc, ByVal S, 0, 0)
    If hThread Then Threads(Ct) = hThread: Ct = Ct + 1
End Sub
 
Private Sub Form_Load()
    Dim Fnt As IFont
    
    hMutex = CreateMutex(ByVal 0, 0, 0)
    TlsIndex = TlsAlloc()
    ClassNameAnsi = StrConv("TrickWindow", vbFromUnicode)
    hInstance = App.hInstance
    Set Fnt = Me.Font
    hFont = Fnt.hFont
End Sub
 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim L As Long
 
    For L = 0 To modTest.Count - 1
        PostMessage modTest.hWnds(L), WM_CLOSE, 0, 0
        WaitForSingleObject Threads(L), INFINITE
        CloseHandle Threads(L)
    Next
 
    TlsFree TlsIndex
    CloseHandle hMutex
End Sub
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 671
Размер:	92.6 Кб
ID:	2046  
Вложения
Тип файла: rar TrickMultithread.rar (11.7 Кб, 478 просмотров)
Метки vb
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
Модель здравоохранения 12. добавление болезней через ресурпул, как аварии
anaschu 22.05.2026
Болезни — это ключевая часть нашей модели. Нам нужно, чтобы работник периодически уходил на больничный, его задание при этом зависало, а после выздоровления работа возобновлялась. Реализуем это двумя. . .
Модель здравоохранения 11. Создаём классы Задание и Работник
anaschu 22.05.2026
В AnyLogic каждая заявка и каждый ресурс — это объект определённого класса. Нам нужно создать два класса: Задание (заявка) и Работник (ресурс). Класс Задание В дереве проекта нажимаем правой. . .
Модель здравоохранения 10. Новая модель, смотрим, как добавлять логические блоки, и что писать внутри
anaschu 22.05.2026
Открываем AnyLogic, создаём новый проект. В дереве проекта появляется класс Main — это главный агент, в котором будет жить вся наша логика. Палитра блоков Слева находится палитра. Нас интересует. . .
модель ЗдравоСохранения 9. Новая модель, разбираемся, как ее создавать
anaschu 22.05.2026
В этой серии постов мы построим модель небольшого рабочего коллектива. Сотрудники получают задания, выполняют их, иногда болеют — и мы хотим посчитать, сколько это стоит компании. Метод. . .
[golang] Linked list
alhaos 22.05.2026
Связный список / Linked list Связный список структура данных позволяющая хранить список значений, в отличии от массива в памяти хранится не сплошным куском, а отдельными частями которые ссылаются. . .
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru