Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Отслеживание появления MessageBoxa / 25 сообщений из 33, страница 1 из 2
15.11.2006, 12:24
    #34129750
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Такая вот проблемка:
Идет процесс - много селектов и апдейтов. Иногда что-то происходит и выдается сообщение об ошибке (см. картинку). Если нажать ОК, то процесс продолжается в полном порядке. Надо каким-то образом нажать на ОК и/или хотябы отловить момент, когда выскакивает это сообщение. Есть линейка с процентами выполнения. Можно через определенные промежутки времени проверять, меняются ли проценты или нет. Но проверка в простом таймере не помогает, т.к. таймер ждет нажатие на ОК и не работает. Что можно сделать?
...
Рейтинг: 0 / 0
15.11.2006, 12:30
    #34129776
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Можно через API-шную FindWindowA
Только запускай в параллельном потоке через Yield
...
Рейтинг: 0 / 0
15.11.2006, 12:30
    #34129777
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Окно с сообщением сами писали или оно открывается функцией MessageBox? А что касается таймера, есть замечательный объект Timing.
...
Рейтинг: 0 / 0
15.11.2006, 12:34
    #34129789
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Похоже как раз по таймеру что-то и пытаются сделать
Ясно же пишет - разрешен только cancel
...
Рейтинг: 0 / 0
15.11.2006, 12:44
    #34129832
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
1. FindWindowA не поможет, т.к. в списке процессов это сообщение не записано. Т.е. оно часть всего приложения.
2. Сообщение не наше. Из-за чего вообще может происходить эта ошибка? 10 раз может работать нормально, а потом вдруг выскакивает эта зараза.
3. Объект Timing не помог. Опять-таки, пока не нажать на ОК, все заморожено.

Появилась такая идея:
1. Записивать проценты выполнения в текстовый файл.
2. Создать отдельную програмку, которая будет через определенные промежутки времени проверять этото текстовый файл. А перед выполнением всего процесса запустить эту маленькую програмку.
Но может быть можно сделать что-нибудь более простое?
...
Рейтинг: 0 / 0
15.11.2006, 12:50
    #34129863
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
AIZОкно с сообщением сами писали или оно открывается функцией MessageBox? А что касается таймера, есть замечательный объект Timing.
это ошибка datawindow. это не MessageBox, и не "самописное" окно.
В dberror везде обработка прописана?
Можно попробовать поставить breakpoint в dberror и если туда попадем - посмотреть на Call Stack.

СУБД какая? MSSQL? Sybase?

Версия билдера какая? девятка или десятка?

Еще вариант - в событии sqlpreview фиксировать в Error object припомощи PopulateError местоположение и из аргументов события текст SQL и скидывать в файл. как только выскочит сообщение - посмотреть какой select и откуда.
...
Рейтинг: 0 / 0
15.11.2006, 12:53
    #34129873
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Идет обращение к БД пока не закончился Retrieve.
Такое бывает если используется retrieverow, а сам Retrieve при этом не отменяют соответствующей функцией (DBCancel?)

Зорин А.
"I love deadlines. I like the whooshing sound they make as they fly by."
-- Douglas Adams
...
Рейтинг: 0 / 0
15.11.2006, 12:57
    #34129885
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
думаю что это мессаж-бокс из вашей программы.
сообщение оч знакомое (скорее всего база Sybase ASE или MS SQL)

проблемы с курсором (он или не деастивируется или не закрывается)
может быть внутри процедуры.
--
надо-бы найти где ошибка, а не искать как закрывать мессаж-бокс
...
Рейтинг: 0 / 0
15.11.2006, 13:01
    #34129908
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Скорее всего так и есть, как сказал Андрей
Проверить events update-ов, retrieve-ов
либо у родительских объектов
Ошибка - есть ошибка, надо ее отловить
А так - видел где-то маленькую программульку которая только этим и занимается - гасит message
Можно конечно заглушить dberror, но это порочная практика
...
Рейтинг: 0 / 0
15.11.2006, 13:09
    #34129941
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Dmitry.думаю что это мессаж-бокс из вашей программы.
сообщение оч знакомое (скорее всего база Sybase ASE или MS SQL)

Это НЕ MessageBox. Это сообщение от datawindow engine. В коде он возникает сразу после вызова dw.Retrieve(...)

Dmitry.проблемы с курсором (он или не деастивируется или не закрывается)
может быть внутри процедуры.
маловероятно. это ошибка уровня драйвера БД. Клиент получает resultset и должен (прежде чем выполнять какой либо SQL) либо "выгрести" все строки до конца, либо ЯВНО отменить retrieve.
Но где-то происходит нежелательное "распараллеливание", т.е. одновременно с Retrieve выполняется что-то еще. Отследить сложно именно из-за того что ошибка вылетает не там где собственно проблема с незакрытым курсором, а на всех последующих попытках обращения к БД

Dmitry.надо-бы найти где ошибка, а не искать как закрывать мессаж-бокс
ну да. чем мы собственно и пытаемся тут заниматься.
...
Рейтинг: 0 / 0
15.11.2006, 13:18
    #34129976
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
1. РВ 6.5
2. Курсоры не используются вообще.
3. Селекты и Апдейты очень большие. Запускаются на несколько часов. В это время идет работа с базой данных (MS SQL). Ошибка возникает не всегда. Отследить в дебаггере такое дело сложно. При нажатии на ОК и все продолжается нормально. Т.е. это даже не ошибка, а просто какое-то сообщение. Хотелось бы просто нажать на ОК и все.
...
Рейтинг: 0 / 0
15.11.2006, 13:34
    #34130048
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
А как процентики выполнения считаются?
...
Рейтинг: 0 / 0
15.11.2006, 13:38
    #34130067
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Если не хочешь отлавливать, напиши в Event DBError RETURN 1. Но, на всякий случай, записывай куда-нибудь передаваемые в событие параметры.
...
Рейтинг: 0 / 0
15.11.2006, 13:45
    #34130103
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Ага
Только они ведь продолжают работать
...
Рейтинг: 0 / 0
15.11.2006, 13:47
    #34130107
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
А DBerror он глобальный
...
Рейтинг: 0 / 0
15.11.2006, 13:47
    #34130114
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Кстати, непонятно, почему Timing не помог? Response на него не влияет никак
...
Рейтинг: 0 / 0
15.11.2006, 13:48
    #34130120
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
spas2001А как процентики выполнения считаются?
В цикле. Изначально знаем, сколько строк надо обновить.
...
Рейтинг: 0 / 0
15.11.2006, 13:50
    #34130130
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
AIZЕсли не хочешь отлавливать, напиши в Event DBError RETURN 1. Но, на всякий случай, записывай куда-нибудь передаваемые в событие параметры.
Практически все происходит без DW.
...
Рейтинг: 0 / 0
15.11.2006, 13:55
    #34130160
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
AIZКстати, непонятно, почему Timing не помог? Response на него не влияет никак
А можно примерчик?
Вот, что было у меня:
Код: plaintext
1.
inv_timing.Start( 3 )
messagebox('', 'stop')
inv_timing - nvuo_timer объект Timing в нем MessageBox('', 'Timing')
При запуске этого скрипта получаю MessageBox('', 'stop'). И только после его закрытия - MessageBox('', 'Timing')
...
Рейтинг: 0 / 0
15.11.2006, 14:19
    #34130305
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Месаджик не там написал
Правильно, ты его пусканул и сразу месага
а надо было в событиях
и потом время -то не в секундах
...
Рейтинг: 0 / 0
15.11.2006, 14:24
    #34130339
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Извиняюсь
Interval The number of seconds that you want between Timer events. interval can be a whole number or fraction greater than 0 and less than or equal to 4,294,967 seconds. If interval is 0, Timer turns off the timer so that it no longer triggers Timer events.
...
Рейтинг: 0 / 0
15.11.2006, 14:28
    #34130357
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Вот пример того, как не надо писать (перекрестные ссылки), но для демонстрации Timing подойдет.

Код: plaintext
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.
forward
global type n_cst_timing from timing
end type
end forward

global type n_cst_timing from timing
end type
global n_cst_timing n_cst_timing

type variables
w_test2	iw
String	is_message
//Long		il_number
end variables
on n_cst_timing.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_timing.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event timer;
iw.st_message.Text = is_message//"Timer № " + String(il_number) //+ String(Now(), "hh:mm:ss")
end event



Код: plaintext
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.
forward
global type w_test2 from window
end type
type st_message from statictext within w_test2
end type
type sle_count from singlelineedit within w_test2
end type
type cb_stop from commandbutton within w_test2
end type
type cb_start from commandbutton within w_test2
end type
end forward

global type w_test2 from window
integer width =  1440 
integer height =  444 
boolean titlebar = true
string title = "Untitled"
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor =  67108864 
string icon = "AppIcon!"
boolean center = true
st_message st_message
sle_count sle_count
cb_stop cb_stop
cb_start cb_start
end type
global w_test2 w_test2

type variables
n_cst_timing	inv_timing[]
end variables

on w_test2.create
this.st_message=create st_message
this.sle_count=create sle_count
this.cb_stop=create cb_stop
this.cb_start=create cb_start
this.Control[]={this.st_message,&
this.sle_count,&
this.cb_stop,&
this.cb_start}
end on

on w_test2.destroy
destroy(this.st_message)
destroy(this.sle_count)
destroy(this.cb_stop)
destroy(this.cb_start)
end on

type st_message from statictext within w_test2
integer x =  201 
integer y =  52 
integer width =  1125 
integer height =  92 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
long textcolor =  33554432 
long backcolor =  67108864 
boolean border = true
borderstyle borderstyle = stylelowered!
boolean focusrectangle = false
end type

type sle_count from singlelineedit within w_test2
integer x =  55 
integer y =  44 
integer width =  96 
integer height =  100 
integer taborder =  10 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
long textcolor =  33554432 
boolean enabled = false
string text = "10"
borderstyle borderstyle = stylelowered!
end type

type cb_stop from commandbutton within w_test2
integer x =  992 
integer y =  192 
integer width =  343 
integer height =  100 
integer taborder =  20 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
string text = "Stop"
end type

event clicked;Long	ll_count, i, ll_ret

ll_count = Long(sle_count.Text)
IF ll_count <  1  THEN RETURN  0 

FOR i =  1  TO ll_count
	inv_timing[i].Stop()
	DESTROY inv_timing[i]
NEXT
Close(Parent)
RETURN  1 
end event

type cb_start from commandbutton within w_test2
integer x =  599 
integer y =  188 
integer width =  343 
integer height =  100 
integer taborder =  10 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
string text = "Start"
end type

event clicked;Long	ll_count, i, ll_ret
n_cst_timing	lnv_timing


ll_count = Long(sle_count.Text)
IF ll_count <  1  THEN RETURN  0 

FOR i =  1  TO ll_count
	inv_timing[i] = CREATE n_cst_timing
	inv_timing[i].iw = Parent
	inv_timing[i].is_message = "Таймер № " + String(i, "00")
	inv_timing[i].Start(i +  1 )
NEXT
MessageBox("Все ли остановилось?","Подождем-с...")
RETURN  1 
end event

...
Рейтинг: 0 / 0
15.11.2006, 14:32
    #34130378
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
spas2001Месаджик не там написал
Правильно, ты его пусканул и сразу месага
а надо было в событиях
и потом время -то не в секундах
Ничего не понял :)
Идея такая:
есть объект inv_timing, который будет запускаться каждые 15 минут inv_timing(900) и проверять текущее значение процентов и предыдущее. Проблема в том, что если выскочит где-то сообщение, то inv_timing не сработает. Вопрос в том, как сделать, чтобы не зависимо ни от чего, inv_timing работал бы каждые 15 минут.
...
Рейтинг: 0 / 0
15.11.2006, 15:22
    #34130621
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
Наверное самое простое на время исполнения заглушить ошибки DW
...
Рейтинг: 0 / 0
15.11.2006, 15:47
    #34130706
boogiman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отслеживание появления MessageBoxa
To Riska

По моему считать, что то на клиенте часами это бред!!! Нарисовали бы DTS - пакет нормальный ну и дёргали его по шедулеру (тем более что MSSQL), да и все бы проблемы ушли!!! Заодно бы новые технологии немножко подняли!!!!
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Отслеживание появления MessageBoxa / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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