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

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

Запись от The trick размещена 29.01.2014 в 00:48
Показов 5019 Комментарии 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
Просмотров: 683
Размер:	92.6 Кб
ID:	2046  
Вложения
Тип файла: rar TrickMultithread.rar (11.7 Кб, 486 просмотров)
Метки vb
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru