purebasic.info

PureBasic forum
Текущее время: Пт окт 19, 2018 2:28 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Зависание при нажатии Alt
СообщениеДобавлено: Вт июн 06, 2017 10:29 pm 
Не в сети
доцент

Зарегистрирован: Пн авг 13, 2012 9:17 am
Сообщений: 71
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
OpenWindow(0, 0, 0, 300, 200, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Procedure RunWindow()
    Protected.i ev
    Repeat
        Debug "{"
        ev = WindowEvent()
        Debug "}"
        If ev = #PB_Event_CloseWindow
            End
        Endif
    Until ev = 0
EndProcedure
Repeat
    RunWindow()
Delay(250)
ForEver


При фокусе на созданном окне и нажатии Alt, а также зажатии левой кнопки мыши после наведения на верхнюю часть окна происходит зависание, по-видимому в функции WindowEvent(). Является ли это багом и возможно ли избавиться от этого?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зависание при нажатии Alt
СообщениеДобавлено: Ср июн 07, 2017 8:36 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Повторить не удалось, не виснет.
зы. PB5.44 WinXP


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зависание при нажатии Alt
СообщениеДобавлено: Ср июн 07, 2017 9:52 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Это особенность винды.
Если нужно чтобы события обрабатывались, нужно их зарегистрировать функциями BindEvent, BindGadgetEvent, BindMenuEvent и т. д.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure Timer()
  Static Value = 0
 
  Value = (Value + 5) % 100
  SetGadgetState(0, Value)
EndProcedure
 
Count = 0
 
If OpenWindow(0, 0, 0, 400, 100, "Timer Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
  AddWindowTimer(0, 123, 250)
  BindEvent(#PB_Event_Timer, @Timer(), 0, 123)
 
  Repeat
    Event = WaitWindowEvent()  
    Debug Count
    Count+1
  Until Event = #PB_Event_CloseWindow
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зависание при нажатии Alt
СообщениеДобавлено: Пт июн 09, 2017 5:07 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 220
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Дело в том что Alt вызывает меню в любой проге и тут хоть и неиспользуется меню то он всерамно переходит в режим меню и ожидает выбора по пунктам меню(которых нет, вы не делали менюшки), вот он и застряет в ожидании. Кажется с помощю SetWindowCallback(@ProcedureName()) такого не происходит. Например при перемещении окна мышкой WindowEvent останавливается, а SetWindowCallback нет, тут можно увидить.

Код:
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
 
OpenWindow(0, 0, 0, 300, 200, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
 
CreateMenu(0, WindowID(0))
MenuTitle("1234")
MenuItem(1,"1")
 
Procedure RunWindow()
    Protected.i ev
    Repeat
        Debug "{"
        ev = WaitWindowEvent()
        Debug "}"
        ;Debug "mouse "+Str(EventType() )
 
        If ev = #PB_Event_CloseWindow
            End
        EndIf
    Until ev = 0
  EndProcedure
 
  Global sss
Procedure tim()
  sss=sss+1
  Debug "Timer-"+Str(sss)
EndProcedure
n=SetTimer_(WindowID(0) ,10,500,@tim())
        ;Если не указывать процедуру, то обрабатывать таймер необходимо
 
 
 
  Global a;это нада чтобы переменная была доступна при следующем входе в процедуру
  Procedure WindowCallback(WindowID, Message, wParam, lParam)
    a=a+1
    Result = #PB_ProcessPureBasicEvents
     Debug Hex(lParam)
;     Debug Hex(EventlParam())
 Debug "MOUSE "+Str(EventType() )
 
 
    Debug "переменная="+a
    ProcedureReturn Result
EndProcedure
 
SetWindowCallback(@WindowCallback())
 
Repeat
    RunWindow()
Delay(250)
ForEver
 
KillTimer_(WindowID(0),10)
 



WindowEvent обрабатывает то что нужно пурику остальное остается висеть на SetWindowCallback. Даже в этой моей проге видно, что если нажать АЛТ и увести мышку с окна то все перестает работать , WaitWindowEvent делает аналогично, таймер прерывания будет работать, значит от внешних прог сообщения приходить будут.
Пётр, у тебя показало, что прога невинет, но на опросе АЛТ меню тоже стала, она ждет нажатия следующего пункта меню, я один пункт спецом вкинул, дабы понятнее было.
По поводу как обойти это вопрос типа а чего тебе надо сделать и почему необойтись другими кнопками :?: . Помоему если отключить WindowEvent, а в SetWindowCallback сделать полноценный обработчик то эта проблема решытся, ну вопервых на 100% неуверен , во вторых это нада знать какие запросы нада обязательно и правильно возвращать дабы прога невисла. Например если необрабатывать перерисовку окна когда оно перемещаестя. У моем блокноте записано такое(может криво) 15=#PB_Event_Repaint:нада прорисовать окно если
оно содержит графику это нада при рисовании прямо в окно WindowOutput (). Иначе прога виснет :D , но незнаю где у меня такое было, кажется редактор графики делал(давно забросил) и вис гдето пока необрабатывал события.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB