powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос по SharedObject
23 сообщений из 23, страница 1 из 1
Вопрос по SharedObject
    #32589596
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю SharedObject.
В нём все мат. действия выполняются независимо от главного tread'a. То есть прога не виснет, когда я пускаю цикл на пару миллионов:) . Но как мне таким же образом запустить retrieve() у DW ? Чтоб он, тяжёленький, выполнялся, а программа не ждала его завершения?
Спасибо.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32589876
ROL32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробовать использовать DataStore вместо DataWindow.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32590292
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как у нас сделано - есть объект для коммуникации с потоком:

Код: 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.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
$PBExportHeader$svc_multithread_pass.sru
$PBExportComments$coreuo.pbl: Object used for parameter passing and communication between the threads.
forward
global type svc_multithread_pass from nonvisualobject
end type
end forward

global type svc_multithread_pass from nonvisualobject
end type
global svc_multithread_pass svc_multithread_pass

type variables
public:
   constant int MULTITHREAD_MODE_SQL =  1 
   constant int MULTITHREAD_MODE_DW =  2 
   constant int MULTITHREAD_MODE_DS =  3 
   boolean           ib_commit = TRUE
   boolean		ib_has_args = FALSE
   boolean		ib_app_closing = FALSE
   int                    ii_mode
   transaction itr
   string                is_data_object
   string                is_sql
   any		iany_arr_args[ 50 ]
   // Transaction object properties.
   boolean		ib_tr_autocommit
   string		is_tr_database
   string		is_tr_dbms	
   string		is_tr_dbparm
   string		is_tr_dbpass
   string		is_tr_lock
   string		is_tr_logid
   string		is_tr_logpass
   string		is_tr_servername
   string		is_tr_sqlreturndata
   string		is_tr_userid

protected:
   datawindow idw
   datastore ids
   powerobject ipo
CONSTANT integer MAX_ARGS =  50 
CONSTANT string CALLBACK_NAME = "ue_multithread_complete"


end variables

forward prototypes
public function integer of_init (string vs_sql, transaction vtr, powerobject vpo, boolean vb_commit)
public function integer of_init (string vs_sql, transaction vtr, powerobject vpo)
public function integer of_init (datawindow vdw, transaction vtr, powerobject vpo)
public subroutine of_multithread_complete (integer vi_returncode, string vs_returnmsg, blob vblob)
public function integer of_init (datastore vds, transaction vtr, powerobject vpo)
public function integer of_init (datastore vds, transaction vtr, powerobject vpo, any aany_arr_args[])
protected function boolean of_isvalid_callback_object (readonly powerobject apo_object)
end prototypes

public function integer of_init (string vs_sql, transaction vtr, powerobject vpo, boolean vb_commit);/ /***********************************************************************************************
// Copyright(C) 2001 Delphi Technology Inc.
//
// Created By:     Will Hitchcock
// Created On:     03/28/2001
// Last Edited By: Will Hitchcock
// Last Edited On: 10/18/2001
//
// Description:
// Initializes the parameter object for explicit execution of dynamic sql.  The arguments are:
//
// 	1) sql string to execute
//    2) transaction object to use
//    3) object to notify when complete (object must have a ue_multithread_complete event)
//
//***********************************************************************************************

// Validate the parameters.
if (IsNull(vs_sql) or Len(Trim(vs_sql)) <= 0) then
	gf_message("Invalid sql string passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if
if (not IsValid(vtr)) then
	gf_message("Invalid transaction object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if
if (not of_Isvalid_callback_object(vpo)) then
	gf_Message("Invalid calling object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if

// Assign the main parameters.
is_sql    = vs_sql
itr       = vtr
ipo       = vpo
ib_commit = vb_commit
ii_mode   = MULTITHREAD_MODE_SQL

// Assign the transaction property parameters.
ib_tr_autocommit    = itr.AutoCommit
is_tr_database      = itr.Database
is_tr_dbms          = itr.DBMS
is_tr_dbparm        = itr.DBParm
is_tr_dbpass        = itr.DBPass
is_tr_lock          = itr.Lock
is_tr_logid         = itr.LogID
is_tr_logpass       = itr.LogPass
is_tr_servername    = itr.ServerName
is_tr_sqlreturndata = itr.SQLReturnData
is_tr_userid        = itr.UserID

// Return successfully.
return 1
end function

public function integer of_init (string vs_sql, transaction vtr, powerobject vpo);return this.of_init(vs_sql, vtr, vpo, TRUE)
end function

public function integer of_init (datawindow vdw, transaction vtr, powerobject vpo);//***********************************************************************************************
// Copyright(C) 2001 Delphi Technology Inc.
//
// Created By:     Will Hitchcock
// Created On:     10/18/2001
// Last Edited By: Will Hitchcock
// Last Edited On: 10/18/2001
//
// Description:
// Initializes the parameter object for retrieval of a datawindow.  The arguments are:
//
// 	1) pointer to the datawindow to be retrieved on a seperate thread
//    2) transaction object to use
//    3) object to notify when complete (object must have a ue_multithread_complete event)
//
//***********************************************************************************************

// Validate the parameters.
if (Not IsValid(vdw)) then
	gf_message("Invalid datawindow string passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if
if (not IsValid(vtr)) then
	gf_message("Invalid transaction object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if
if (not of_Isvalid_callback_object(vpo)) then
	gf_Message("Invalid calling object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return -1
end if

// Assign the main parameters.
idw            = vdw
is_data_object = idw.dataobject
itr            = vtr
ipo            = vpo
ii_mode        = MULTITHREAD_MODE_DW

// Assign the transaction property parameters.
ib_tr_autocommit    = itr.AutoCommit
is_tr_database      = itr.Database
is_tr_dbms          = itr.DBMS
is_tr_dbparm        = itr.DBParm
is_tr_dbpass        = itr.DBPass
is_tr_lock          = itr.Lock
is_tr_logid         = itr.LogID
is_tr_logpass       = itr.LogPass
is_tr_servername    = itr.ServerName
is_tr_sqlreturndata = itr.SQLReturnData
is_tr_userid        = itr.UserID

// Return successfully.
return 1
end function

public subroutine of_multithread_complete (integer vi_returncode, string vs_returnmsg, blob vblob);/*------------------------------------------------------------------------------

 Function:			svc_multithread_pass.of_Multithread_complete

 Returns:         (None)

 Parameters:      Integer vi_returncode
                  String vs_returnmsg
                  Blob vblob

 Copyright © 2001 DTI - Will Hitchcock

 Date Created: 03/28/2001

 Description:	This function is called by the multithread service (svc_multithread) 
 					when a multithread call has been completed.  This function is responsible 
					for letting the calling object know that the call is complete by 
					triggering the calling object's ue_multithread_complete event.
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
 10/28/2001		Will Hitchcock
 11/26/2001		Philip Salgannik		Added datastore processing, validity checks
------------------------------------------------------------------------------*/ 

CHOOSE CASE ii_mode

	CASE MULTITHREAD_MODE_DW
		IF NOT IsValid(idw) THEN RETURN
		idw.SetFullState(vblob)
	CASE MULTITHREAD_MODE_DS
		IF NOT IsValid(ids) THEN RETURN
		ids.SetFullState(vblob)
END CHOOSE
IF IsValid(ipo) THEN
	ipo.dynamic event ue_multithread_complete(vi_returncode, vs_returnmsg)
END IF
end subroutine

public function integer of_init (datastore vds, transaction vtr, powerobject vpo); /*------------------------------------------------------------------------------

 Function:			svc_multithread_pass.of_Init

 Returns:         Integer

 Parameters:      DataStore vds - pointer to the datastore to be retrieved on a seperate thread
                  Transaction vtr - transaction object to use
                  PowerObject vpo - object to notify when complete 
						(object must have a ue_multithread_complete event - CALLBACK)

 Copyright © 2001 DTI - Philip Salgannik

 Date Created: 11/23/2001

 Description:	Description:
					Initializes the parameter object for retrieval of a datastore.
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/ 


// Validate the parameters.
if (Not IsValid(vds)) then
	gf_message("Invalid datastore string passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return - 1 
end if
if (not IsValid(vtr)) then
	gf_message("Invalid transaction object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return - 1 
end if
if (not of_Isvalid_callback_object(vpo)) then
	gf_Message("Invalid calling object passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return - 1 
end if

// Assign the main parameters.
ids            = vds
is_data_object = ids.dataobject
itr            = vtr
ipo            = vpo
ii_mode        = MULTITHREAD_MODE_DS

// Assign the transaction property parameters.
ib_tr_autocommit    = itr.AutoCommit
is_tr_database      = itr.Database
is_tr_dbms          = itr.DBMS
is_tr_dbparm        = itr.DBParm
is_tr_dbpass        = itr.DBPass
is_tr_lock          = itr.Lock
is_tr_logid         = itr.LogID
is_tr_logpass       = itr.LogPass
is_tr_servername    = itr.ServerName
is_tr_sqlreturndata = itr.SQLReturnData
is_tr_userid        = itr.UserID

// Return successfully.
return  1 
end function

public function integer of_init (datastore vds, transaction vtr, powerobject vpo, any aany_arr_args[]); /*------------------------------------------------------------------------------

 Function:			svc_multithread_pass.of_Init

 Returns:         Integer

 Parameters:      DataStore vds
                  Transaction vtr
                  PowerObject vpo
                  Any aany_arr_args[]

 Copyright © 2001 DTI - Philip Salgannik

 Date Created: 11/26/2001

 Description:	Overloaded version - sets up retrieval arguments, see the other version 
 					for more info
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/ 


integer li_num_args, li_rtn, kounter
// Validate the parameters.
if IsNull(aany_arr_args)then
	gf_message("Invalid array of arguments passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return - 1 
end if
li_num_args = UpperBound(aany_arr_args)
IF li_num_args > MAX_ARGS THEN
	gf_message("Number of arguments passed to SVC_MULTITHREAD_PASS.OF_INIT() exceeds allowed " +String(MAX_ARGS) +".", Exclamation!)
	return - 1 
end if
if li_num_args <  1  THEN
	gf_message("Invalid array of arguments passed to SVC_MULTITHREAD_PASS.OF_INIT().", Exclamation!)
	return - 1 
end if

li_rtn = of_init(vds, vtr, vpo)

ib_has_args = (li_rtn =  1 )
IF ib_has_args THEN
	FOR kounter =  1  TO li_num_args
		iany_arr_args[kounter]=aany_arr_args[kounter]		
	NEXT
END IF

RETURN li_rtn
end function

protected function boolean of_isvalid_callback_object (readonly powerobject apo_object); /*------------------------------------------------------------------------------

 Function:			svc_multithread_pass.of_Isvalid_callback_object

 Returns:         Boolean

 Parameters:      PowerObject apo_object

 Copyright © 2001 DTI - Philip Salgannik

 Date Created: 11/28/2001

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/ 
boolean	lb_found
int		li_scripts
int		li_cnt =  1 
classdefinition lcd
scriptdefinition	lscrd_list[]

IF NOT IsValid(apo_object) OR IsNull(apo_object) THEN RETURN FALSE

// Find event definition
lcd = apo_object.ClassDefinition
lscrd_list[] = lcd.scriptList[]
li_scripts = upperBound (lscrd_list[])
do while li_cnt <= li_scripts and not lb_found
	if lscrd_list[li_cnt].name = CALLBACK_NAME and lscrd_list[li_cnt].kind = scriptevent! then
		lb_found = true
	else
		li_cnt++
	end if
loop

RETURN lb_found
end function

on svc_multithread_pass.create
TriggerEvent( this, "constructor" )
end on

on svc_multithread_pass.destroy
TriggerEvent( this, "destructor" )
end on

Есть объект, который и будет потоком:

Код: 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.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
$PBExportHeader$svc_multithread.sru
$PBExportComments$coreuo.pbl: Provides a way to execute logic on a unique thread so that the application does not lock up.
forward
global type svc_multithread from nonvisualobject
end type
end forward

global type svc_multithread from nonvisualobject
end type
global svc_multithread svc_multithread

type variables
protected:
   datastore   ids
   transaction itr

end variables

forward prototypes
public subroutine of_execute (svc_multithread_pass vsvc_pass)
public subroutine of_retrieve (svc_multithread_pass vsvc_pass)
end prototypes

public subroutine of_execute (svc_multithread_pass vsvc_pass); /*------------------------------------------------------------------------------

 Function:			svc_multithread.of_Execute

 Returns:         (None)

 Parameters:      svc_multithread_pass vsvc_pass

 Copyright © 2001 DTI - Will Hitchcock

 Date Created: 03/28/2001

 Description:	This function executes the multithreaded activity which can be either
 					exlicit execution of a sql statement or retrieval of a datawindow 
					(specified by the properties in vsvc_pass).  In order to exploit the 
					multithreaded functionality, this function call must be posted.
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
 10/18/2001		Will Hitchcock
 11/26/2001 	Philip Salgannik		Added retrieval arguments capability
 5/9/2003		Philip Salgannik		Restructured the code for better error checking 
 												for validity of db connection 
------------------------------------------------------------------------------*/ 
// Local variable declarations.
blob            lblob
long            ll_returncode =  1 
string          ls_returnmsg, ls_filename
long ll_rows
integer li_file

IF NOT IsValid(vsvc_pass) THEN RETURN
IF vsvc_pass.ib_app_closing THEN RETURN
// Create, initialize and connect the transaction object.
itr               = create transaction
itr.AutoCommit    = vsvc_pass.ib_tr_autocommit
itr.Database      = vsvc_pass.is_tr_database
itr.DBMS          = vsvc_pass.is_tr_dbms
itr.DBParm        = vsvc_pass.is_tr_dbparm
itr.DBPass        = vsvc_pass.is_tr_dbpass
itr.Lock          = vsvc_pass.is_tr_lock
itr.LogID         = vsvc_pass.is_tr_logid
itr.LogPass       = vsvc_pass.is_tr_logpass
itr.ServerName    = vsvc_pass.is_tr_servername
itr.SQLReturnData = vsvc_pass.is_tr_sqlreturndata
itr.UserID        = vsvc_pass.is_tr_userid
connect using itr;

IF (itr.SQLCode <>  0 ) THEN
	
	ls_returnmsg  = "Unable to establish database connection in SVC_MULTITHREAD::OF_EXECUTE()."
	ll_returncode = - 1 
	
ELSE
	
	if (vsvc_pass.ii_mode = SVC_MULTITHREAD_PASS.MULTITHREAD_MODE_SQL) then
		
			// Execute SQL.
			EXECUTE IMMEDIATE :vsvc_pass.is_sql USING itr;
			if (itr.SQLDBCode <>  0 ) then
				ls_returnmsg = "Dynamic execution of SQL failed in SVC_MULTITHREAD::OF_EXECUTE()."
				if (Len(itr.SQLErrText) >  0 ) then
					ls_returnmsg += "  Error: " + itr.SQLErrText
				end if	
				rollback using itr;
				disconnect using itr;
				ll_returncode = - 1 
			else
				if (vsvc_pass.ib_commit) then
					commit using itr;
				end if
				disconnect using itr;
			end if
			
	else //we are doing a datastore
		
		if (not IsValid(ids)) then
			ids = create datastore
		end if
		IF NOT IsValid(vsvc_pass) THEN 
			disconnect using itr;
			RETURN
		END IF
		IF vsvc_pass.ib_app_closing THEN 
			disconnect using itr;
			RETURN
		END IF
		ids.dataobject = vsvc_pass.is_data_object
		IF ids.SetTransObject(itr) =  1  THEN
			of_Retrieve(vsvc_pass)
		END IF
		ids.GetFullState(lblob)
		disconnect using itr;
		
	end if
	
	
END IF

// push return code back to client

IF IsValid(vsvc_pass) THEN
	IF NOT vsvc_pass.ib_app_closing THEN
		vsvc_pass.of_multithread_complete(ll_returncode, ls_returnmsg, lblob)
	END IF
END IF


end subroutine

public subroutine of_retrieve (svc_multithread_pass vsvc_pass); /*------------------------------------------------------------------------------

 Function:			svc_multithread.of_Retrieve

 Returns:         (None)

 Parameters:      svc_multithread_pass vsvc_pass

 Copyright © 2001 DTI - Philip Salgannik

 Date Created: 11/29/2001

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/ 



IF vsvc_pass.ib_has_args THEN
	ids.Retrieve ( &
				vsvc_pass.iany_arr_args[ 1 ],  vsvc_pass.iany_arr_args[ 2 ],  vsvc_pass.iany_arr_args[ 3 ],  vsvc_pass.iany_arr_args[ 4 ],  vsvc_pass.iany_arr_args[ 5 ], &
				vsvc_pass.iany_arr_args[ 6 ],  vsvc_pass.iany_arr_args[ 7 ],  vsvc_pass.iany_arr_args[ 8 ],  vsvc_pass.iany_arr_args[ 9 ],  vsvc_pass.iany_arr_args[ 10 ], &
				vsvc_pass.iany_arr_args[ 11 ], vsvc_pass.iany_arr_args[ 12 ], vsvc_pass.iany_arr_args[ 13 ], vsvc_pass.iany_arr_args[ 14 ], vsvc_pass.iany_arr_args[ 15 ], &
				vsvc_pass.iany_arr_args[ 16 ], vsvc_pass.iany_arr_args[ 17 ], vsvc_pass.iany_arr_args[ 18 ], vsvc_pass.iany_arr_args[ 19 ], vsvc_pass.iany_arr_args[ 20 ], &
				vsvc_pass.iany_arr_args[ 21 ], vsvc_pass.iany_arr_args[ 22 ], vsvc_pass.iany_arr_args[ 23 ], vsvc_pass.iany_arr_args[ 24 ], vsvc_pass.iany_arr_args[ 25 ], &
				vsvc_pass.iany_arr_args[ 26 ], vsvc_pass.iany_arr_args[ 27 ], vsvc_pass.iany_arr_args[ 28 ], vsvc_pass.iany_arr_args[ 29 ], vsvc_pass.iany_arr_args[ 30 ], &
				vsvc_pass.iany_arr_args[ 31 ], vsvc_pass.iany_arr_args[ 32 ], vsvc_pass.iany_arr_args[ 33 ], vsvc_pass.iany_arr_args[ 34 ], vsvc_pass.iany_arr_args[ 35 ], &
				vsvc_pass.iany_arr_args[ 36 ], vsvc_pass.iany_arr_args[ 37 ], vsvc_pass.iany_arr_args[ 38 ], vsvc_pass.iany_arr_args[ 39 ], vsvc_pass.iany_arr_args[ 40 ], &
				vsvc_pass.iany_arr_args[ 41 ], vsvc_pass.iany_arr_args[ 42 ], vsvc_pass.iany_arr_args[ 43 ], vsvc_pass.iany_arr_args[ 44 ], vsvc_pass.iany_arr_args[ 45 ], &
				vsvc_pass.iany_arr_args[ 46 ], vsvc_pass.iany_arr_args[ 47 ], vsvc_pass.iany_arr_args[ 48 ], vsvc_pass.iany_arr_args[ 49 ], vsvc_pass.iany_arr_args[ 50 ])


ELSE
	ids.Retrieve()			
END IF
	

end subroutine

on svc_multithread.create
call super::create
TriggerEvent( this, "constructor" )
end on

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

event destructor;if (IsValid(itr)) then
	disconnect using itr;
 	DESTROY itr
end if
IF IsValid(ids) THEN DESTROY ids
end event

Если внимательно почитаете код, то всё должно быть ясно...
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32590839
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь вот такой вопрос:
в самом SharedObject я создал DataStore , забил его данными, а как теперь мне эти данные передать в другую функцию?

Понятно, что простой rowcopy сделать я не могу.
Как тогда быть?
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32590965
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MixА теперь вот такой вопрос:
в самом SharedObject я создал DataStore , забил его данными, а как теперь мне эти данные передать в другую функцию?

Понятно, что простой rowcopy сделать я не могу.
Как тогда быть?
GetFullState/SetFullState
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32591272
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея просто классная.
Но вот проблема вылезла:
у меня в SharedObject сидит переменная, которую мне необходимо передать наружу из SharedObject (предположим, как параметр функции). Но из этого объекта можно выполнить только TriggerEvent (по крайней мере я только этот способ использовал) Все другие, как то Event, функцию PB забраковал, говоря, что такой функции он не видит. Как можно всё-таки передать tyne переменную?

Спасибо большое!
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32591350
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА теперь вот такой вопрос:
в самом SharedObject я создал DataStore , забил его данными, а как теперь мне эти данные передать в другую функцию?

Через "коммуникационный объект", в котором тоже должен быть Data Store
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32591412
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попобробнее можно о реализации?
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32592027
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mix , вы с какой-то специальной планеты, или тут над нами подтруниваете с вопросами типа А попобробнее можно о реализации?

Я же вам ПОЛНУЮ реализацию постнул, с "коммуникационным объектом" и с GetFullState/SetFullState. Ипортните эти два объекта, всё что нужно сделать, это сделать что-нибудь в духе:

1) В вашем объекте ИЗ которого вы стартуете потоки задекларировать и заскриптать (тут вы будете вынимать FullState того, что ретривалось в отдельном потоке) событие ue_Multithread_complete /Parameters: Integer ai_ret_code
String as_ret_message

2) В вашем объекте ИЗ которого вы стартуете потоки сделать instance переменные:
Код: plaintext
1.
datastore ids
svc_multithread_pass inv_pass

3) Там где вы делаете SharedObjectRegister/SharedObjectGet написать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
svc_multithread lnv_thread

ids = CREATE datastore
ids.dataobject = "d_your_name"

inv_pass = CREATE svc_multithread_pass
inv_pass.of_init(lds, SQLCA, this)

Произвести SharedObjectRegister ( "bla", "bla-bla")
Произвести SharedObjectGet ( "bla-bla", lnv_thread)

lnv_thread.post of_Execute(inv_pass)
SharedObjectUnRegister (  "bla-bla")

4) В событии ue_Multithread_complete (которое по сути callback) вы уже получите ваш instance datastore c данными, ретривнутыми в другом потоке, типа:
long ll_rows
IF ai_ret_code = 1 AND Trim(as_ret_message) = "" THEN
ll_rows = ids.RowCount()
//делай что надо
END IF



Если нужны retrieval arguments, то в пунте 3) нужно объявить
any lany_args[]
Заполнить (<= 50) и позвать overloaded version inv_pass.of_init(lds, SQLCA, this, lany_args)
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32674807
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стал создавать новую тему, решил задать вопрос прямо здесь. Делаю то, что посоветовал Филипп в другом топике . Так вот, чего-то я не догоняю. А как, собственно, вырубить (прервать) долгий ретрив? Объекты svc_multithread_pass и svc_multithread подключил, поток создается, ретрив идет, а как прервать его - не понятно. Подскажите, убогому
Э-э-э, только обьясните, пожалуйста, "на пальцАх", а то мы из дерЁвни, могЁм сразу и не понять
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32674875
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вооружаемся DBHandle() и, как всегда, www.google.ru ->группы->
строка для поиска "прервать запрос" находим там на первой страницк топик из su.dbms.mssql Читаем, думаем.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32674969
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не думается сегодня мне что-то.
Если ты об DBCancel() то я ее уже "щупал", ясно дело без SQLCA.DBParm = 'Async = 1' , ибо в OLEDB его как бы нет...
Хотя все эксперименты провожу на MSS MS SQL Server 6.X .
Ну я же сказал, что "на пальцах" обьяснить надо, иначе никак не пойму. И лучше всего обьяснение усвоится, когда оно будет использовать данные выше svc_multithread_pass и svc_multithread ...
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32675228
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНет, не думается сегодня мне что-то.
Если ты об DBCancel() то я ее уже "щупал", ясно дело без SQLCA.DBParm = 'Async = 1', ибо в OLEDB его как бы нет...
Хотя все эксперименты провожу на MSS MS SQL Server 6.X.
Оригинально. Для того чтобы дергать методы OLEDB нужно и работать с OLEDB, по-моему это очевидно. С DBCancel() вообще проблем быть не должно. А как вызвать IComman::Cancel (наверное это то, что нужно) нужно подумать.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #32675517
Black Savage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не находишь, что этот код должен работать с разными Database Interfaces ? Хм-м-м, если он, конечно, работает...
У нас при асинхронном режиме в MSS MS SQL Server 6.X как раз и используется связка SQLCA.DBParm = 'Async = 1' и DBCancel() и там все работает. Здесь же, если честно, я вообще не понимаю, как это может работать. Видимо, придется Филиппа ждать
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вопрос по SharedObject
    #35517706
zubr13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь объясните на пальцах какие еще дополнительные обьекты необходимо создать и с какими методами чтобы создать доп поток. А то мне срочно надо. Заранее спасибо) Уж извините за такой тупую просьбу, но действительно надо.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35518003
zubr13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
inv_pass.of_init(lds, SQLCA, this) --- я никак не могу понять эту строчку, почему сам на себя обращается, и откуда локальный datastore
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35518211
_zubr13_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и что такое "bla" и "bla-bla" :)
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35519485
Фотография ИвановНН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black SavageА как, собственно, вырубить (прервать) долгий ретрив?
Как вариант сделать disconnect транзакции.
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35519699
zubr13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_zubr13_и что такое "bla" и "bla-bla" :)

Зря смеешься
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35519994
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если тебе не понятно что здесь написано - не используй.
если на пальцах про "потоки" в ПБ:

отдельный поток появляется когда вызываешь ф-ю шаред обьекта методом POST

пример

допустим есть у тебя невизуальный обьект n_test с ф-цией of_multiply(x,y)

чтобы вызвать ее в отдельном потоке:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//on app open
sharedobjectregister("n_test", "shared_n_test")

//start thread
n_test ln_test
sharedobjectget("shared_n_test", ln_test)
ln_test.post of_multiply(x,y)

//on app close
sharedobjectunregister("shared_n_test")

Обьект, созданый через sharedobjectregister, создается в отдельном пространстве и не может доступаться к другим обьектам вашего основного приложения.

Если мы хотим знать когда и как ф-я закончила выполнение,
надо в конце этой ф-ции поставить вызов ф-ции или события из обьекта вашего основного приложения.
Поэтому добавляем как параметр в ф-ю of_multiple невизуальный обьект-слушатель.
Код: plaintext
1.
2.
3.
4.
5.
6.
of_multiple(x, y, locator)
    //пример кода ф-ции multiple
    //производим вычисления
    double ret
    ret=x*y
    //посылаем результат слушателю.
    locator.ue_multiply(ret)

http://www.sql.ru/forum/actualthread.aspx?tid=308028&hl=sharedobject
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35674908
vovan_z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу сделать retriev в отдельном потоке
все отрабатывает только интерфейс замораживается во время выполнения
помогите пожалуйста разобраться
вот стартовый скрипт в объекте

svc_multithread lnv_thread

lnv_thread=create svc_multithread

ids = CREATE datastore
ids.dataobject = "dw_test"

inv_pass = CREATE svc_multithread_pass
inv_pass.of_init(ids, SQLCA, this)

SharedObjectRegister ("ids","shared_ids" )
SharedObjectGet ( "shared_ids",lnv_thread)

lnv_thread.post of_Execute(inv_pass)
SharedObjectUnRegister ("shared_ids")

спасибо
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35676609
vovan_z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам разобрался
все заработало
спасибо
...
Рейтинг: 0 / 0
Вопрос по SharedObject
    #35680247
vovan_z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Филипп
Филипп, стабильно ли работают sharedobject в PB 10.2.1?
почему то не всегда выполняется ue_multithread_complete
подскажите, в чем может быть дело?

Вот стартовый скрипт
SharedObjectRegister ("svc_multithread","shared_thread" )
svc_multithread lnv_thread
SharedObjectGet ( "shared_thread",lnv_thread)

ids = CREATE datastore
ids.dataobject = "dw_test"

inv_pass = CREATE svc_multithread_pass
inv_pass.of_init(ids, SQLCA, this)

lnv_thread.post of_Execute(inv_pass)
SharedObjectUnRegister ("shared_thread")

спасибо
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос по SharedObject
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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