Timer (API)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Timer (API)

Сообщение -=TsA=- » 21.09.2004 (Вт) 14:41

Написал программу с использованием API Timer
В Desing режиме работает нормально а после сборки EXE
при запуске вываливается сообщение:

*Инструкция по адресу '0x660cc26f' обратилась к памяти по адресу '0x0000009c'. Память не может быть 'written'.*
'OK' -- завершение приложения
'Отмена' -- отладка приложения

Где здесь собака порылась?
(VB6 SP5, WinXP SP1) :?:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.09.2004 (Вт) 14:42

Код инициализации таймера в студию
Lasciate ogni speranza, voi ch'entrate.

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 21.09.2004 (Вт) 14:55

hQueue = CreateTimerQueue()
CreateTimerQueueTimer hTimer, hQueue, AddressOf tmHide, ByVal 0&, 0, 1000, WT_EXECUTEONLYONCE

tmHide - процедура в модуле

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.09.2004 (Вт) 14:59

Сигнатуру tmHide в студию.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 21.09.2004 (Вт) 15:08

Public Sub tmHide(ByVal lpParameter As Long, ByVal TimerOrWaitFired As Long)
Call Frame.HideFrame
End Sub

Frame - это форма откуда таймер создается

Ну и Frame.HideFrame заодно:

Public Function HideFrame()
Dim N As Long
DeleteTimerQueueTimer hQueue, hTimer, ByVal 0&
SetWindowPos Me.hWnd, SWP_HIDEWINDOW, 0, 0, 0, 0, SWP_NOACTIVATE
N = Int(Rnd * I)
Word.Caption = Trim$(Dict(N))
x = Int((W - Word.Width - 50 + 1) * Rnd + 50)
y = Int((H - Word.Height - 50 + 1) * Rnd + 50)
End Function
:shock:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.09.2004 (Вт) 15:31

Имхо, дело в потоковой небезопасности класса Form.
Так что, действительно, будет работать под IDE :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 21.09.2004 (Вт) 15:33

И что же делать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.09.2004 (Вт) 16:09

Либо обломиться, либо переводить в потокобезопасную форму.
Например, вместо прямого вызова метода формы делать ей postmessage, а уже в форме сабклассингом вылавливать и реагировать.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.09.2004 (Вт) 19:01

BTW, некоторым больше нравится слать сообщение BM_CLICK невидимой кнопке, чем возиться с сабклассингом. Может быть, TsA так будет проще.
Изображение

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 22.09.2004 (Ср) 6:12

Извините за назойливость, а примерчик можно?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.09.2004 (Ср) 12:38

Хм...
hWnd - тоже проперть, и тоже потоконебезопасная. Поэтому...
[under construction... wait a minute...]
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.09.2004 (Ср) 12:50

Воспользуемся, действительно, предложением Тёмыча :)

На искомой форме заводим невидимую кнопку cmdSubclass. В обработчике cmdSubclass_Click пишем всю ту ботву, которая в данный момент находится в процедуре HideForm. Саму HideForm стираем нафиг.
Команда создания таймера должна выглядеть так:
Код: Выделить всё
CreateTimerQueueTimer hTimer, hQueue, AddressOf tmHide, ByVal Frame.cmdSubclass.hWnd, 0, 1000, WT_EXECUTEONLYONCE


А код tmHide, соответственно, так:
Код: Выделить всё
PostMessage lParameter, BN_CLICK, 0, ByVal 0&


По идее, это должно работать.
hWnd мы передаём через lParam потому, что это тоже проперть объекта, а значит она тоже потоконебезопасна. А так это число будет запомнено таймером, и при его отсыле объект затрагиваться не будет.

ЗЫ: не проверял :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 22.09.2004 (Ср) 15:08

Ща проверим

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.09.2004 (Пт) 17:08

Ну так и чё? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

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

    TopList