powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как грамотно организовать "очередь сообщений"
1 сообщений из 26, страница 2 из 2
А как грамотно организовать "очередь сообщений"
    #38297220
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77Чем тогда мой вариант с массивом плох?Исключительно количеством кода.
Дмитрий77и где там могут быть заморочки?У тебя их не будет. Они могут быть у того, кто будет поддерживать этот код после тебя. 4 строчки с коллекцией понятней, чем полтора десятка с массивом, согласись.
Ну вроде сделал, не так уж много кода получилось и довольно аккуратно:

Код: vbnet
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.
Public AppMessages() As MyMessage
'========
  'инициализация массива сообщений в трей
  ReDim AppMessages(0 To 0) 'очистка-0-й элемент не используется
'========

Public Sub AddTrayMessageToQueue(new_message As MyMessage)
  'добавление сообщения в конец массива
  ReDim Preserve AppMessages(0 To UBound(AppMessages) + 1)
  AppMessages(UBound(AppMessages)) = new_message
  
  'вывод в трей сообщения, если нет текущего активного
  If UBound(AppMessages) = 1 Then 'кроме добавленного сообщения ничего нет
    'показать в трей AppMessages(1)
    ShowTrayNotification AppMessages(1)
  End If
End Sub

Public Sub RemoveTrayMessageFromQueue(need_action As Boolean)
  'если пользователь кликнул на Notification, то производятся действия согласно сообщению
  'NIN_BALLOONUSERCLICK
  If need_action Then
    With AppMessages(1)
      'выполнение команд
    End With
  End If
  'если оно закрылось по таймауту, было закрыто крестиком либо из кода приложения, то ничего не делаем
  'NIN_BALLOONTIMEOUT либо NIN_BALLOONHIDE
  
  'удаляем сообщение из очереди сдвигом элементов массива на единицу и удалением крайнего элемента
  'сдвиг на единицу если оно не единственное
  If UBound(AppMessages) > 1 Then '0-не используется, 1-удаляемое, 2-следующее и т.д.
    Dim i As Long
    For i = 1 To UBound(AppMessages) - 1
       AppMessages(i) = AppMessages(i + 1)
    Next
  End If
  
  'удаляем старший элемента массива
  ReDim Preserve AppMessages(0 To UBound(AppMessages) - 1)
  
  'если в очереди остались сообщения, то выводим первое из них в трей
  If UBound(AppMessages) > 0 Then
    'показать в трей AppMessages(1)
    ShowTrayNotification AppMessages(1)
  End If
End Sub

'========

    Case WM_MySysTrayNotify 'уведомления Tray -вместо WM_MOUSEMOVE
...
        Case NIN_BALLOONUSERCLICK 'пользователь кликнул по Notification
          RemoveTrayMessageFromQueue True
        Case NIN_BALLOONTIMEOUT 'пользователь закрыл Notification крестиком либо выход по таймауту
          RemoveTrayMessageFromQueue False
        Case NIN_BALLOONHIDE 'от приложения поступила команда убрать Notification
          RemoveTrayMessageFromQueue False



Причем AddTrayMessageToQueue и RemoveTrayMessageFromQueue самодостаточны (полностью управляют очередью, реальным выводом в трей и выполнением команд при кликаньи на Notification) - не нужно никаких чудо-таймеров которые за всем этим следят.
Сейчас код проходит первые испытания в реальном приложении, вроде как полет нормальный.
...
Рейтинг: 0 / 0
1 сообщений из 26, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как грамотно организовать "очередь сообщений"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]