RE: (forte-users) Confusion with return event
Samer,
The return event is delivered to the calling task, which is the window in
your first test. It is not deliverd to the event loop of the service object
unless the call to the processor originated in the event loop, which is the
case in your second test. The output you get from the server is exactly as I
would expect.
You need the following code in you client:
event loop
postregister
SomeService1.StartImmediate();
when SomeService1.Proc.ProcessEvent_return do
task.Part.Logmgr.Putline('ProcessEvents_return');
when SomeService1.Proc.ProcessEvent_exception do
task.Part.Logmgr.Putline('ProcessEvents_exception');
end event;
Note that this logoutput will not be written to a logfile, but will appear
in the logwindow which is opened when you start a client application.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
-----Original Message-----
From: Samer Kanjo [mailto:skanjoyahoo.com]
Sent: Thursday, January 18, 2001 1:54 AM
To: ForteUsers
Subject: (forte-users) Confusion with return event
I have observed some odd behavior when attempting to
catch a return event for a method invoked using start
task. I provided the primary classes I used during my
test and some output produced by those classes at the
bottom of this message.
The SomeService1 class is used to create an
environment visible service object and the Processor
class is one of its members. The Processor class
starts processing when one of two things happens: the
SomeService1 timer ticks off 10 seconds or when
SomeService1.StartImmediate is called directly by
another entity. Either way StartImmediate is called to
start processing.
The provided output is the result of starting a test
application and invoking StartImmediate from another
object (I used a window) and then observing what
happens when the timer ticks. As you can see the
invocation from the window did not result in the
return event being received. However, the return event
was received when the timer ticked.
According to the Forte documentation a return event
will only be posted to the parent task's event queue.
Since I am making a cross partition call, the window
and service object are not really in the same task
(Unless my assumption is wrong). That would explain
why the window did not cause a return event to be
generated but was an event generated but not caught
and if so where did the event go?
In SomeService2 class I added an event StartProcessing
and moved the code from StartImmediate to the
StartProcessing event case in the event loop and
simply posted the StartProcessing event in
StartImmediate. I performed the same test I used when
testing SomeService1. The Traceback output is
identical for the window invocation but the return
event is received this time! Why?
It seems that to guarantee the receipt of a return
event an asynchronous task must be initiated from
within an event loop. Is this correct?
I do not understand this behavior does someone have
any thoughts on this? How can you guarantee the
receipt of a return event?
Samer Kanjo
OUTPUT FROM SOMESERVICE1
StartTaskTest_cl0: processing loop listening
StartTaskTest_cl0:
Traceback:
SomeService.StartImmediate at line 1
TestWin.Display at line 4
C++ Method(s)
UserApp.Run at offset 105
StartTaskTest_cl0:
StartTaskTest_cl0: Start processing...
StartTaskTest_cl0: Processing complete.
StartTaskTest_cl0:
Traceback:
SomeService.StartImmediate at line 1
SomeService.ProcessingLoop at line 9
StartTaskTest_cl0:
StartTaskTest_cl0: Start processing...
StartTaskTest_cl0: Processing complete.
StartTaskTest_cl0: ProcessEvents_return
OUTPUT FROM SOMESERVICE2
StartTaskTest_cl0: processing loop listening
StartTaskTest_cl0:
Traceback:
SomeService2.StartImmediate at line 1
TestWin.Display at line 4
C++ Method(s)
UserApp.Run at offset 105
StartTaskTest_cl0:
StartTaskTest_cl0: Start processing...
StartTaskTest_cl0: Processing complete.
StartTaskTest_cl0: ProcessEvents_return
StartTaskTest_cl0:
Traceback:
SomeService2.StartImmediate at line 1
SomeService2.ProcessingLoop at line 9
StartTaskTest_cl0:
StartTaskTest_cl0: Start processing...
StartTaskTest_cl0: Processing complete.
StartTaskTest_cl0: ProcessEvents_return
SOMESERVICE1 CLASS
begin CLASS;
class SomeService1 inherits from Framework.Object
has public attribute proc: StartTaskTest.Processor;
has public attribute processing: Framework.boolean;
has public method Init;
has public method ProcessingLoop;
has public method StartImmediate;
has property
shared=(allow=off, override=on);
transactional=(allow=off, override=on);
monitored=(allow=off, override=on);
distributed=(allow=on, override=on, default=off);
end class;
method SomeService1.Init
begin
super.Init();
processing = FALSE;
proc = new;
start task ProcessingLoop();
end method;
method SomeService1.ProcessingLoop
begin
timer : Timer = new;
timer.tickInterval = 10000;
event loop
task.part.logmgr.putline('processing loop
listening');
timer.isActive = TRUE;
when timer.tick do
StartImmediate();
when proc.ProcessEvents_return do
task.part.logmgr.putline('ProcessEvents_return');
processing = FALSE;
when proc.ProcessEvents_exception do
task.part.logmgr.putline('ProcessEvents_exception');
processing = FALSE;
when task.shutdown do
exit;
end event;
end method;
method SomeService1.StartImmediate
begin
task.part.logmgr.putline(task.traceBack());
processing = TRUE;
start task proc.ProcessEvents() where completion =
event;
end method;
end CLASS;
SOMESERVICE2 CLASS
begin CLASS;
class SomeService2 inherits from Framework.Object
has public attribute proc: StartTaskTest.Processor;
has public attribute processing: Framework.boolean;
has public event StartProcessing;
has public method Init;
has public method ProcessingLoop;
has public method StartImmediate;
has property
shared=(allow=off, override=on);
transactional=(allow=off, override=on);
monitored=(allow=off, override=on);
distributed=(allow=on, override=on, default=off);
end class;
method SomeService2.Init
begin
super.Init();
processing = FALSE;
proc = new;
start task ProcessingLoop();
end method;
method SomeService2.ProcessingLoop
begin
timer : Timer = new;
timer.tickInterval = 10000;
event loop
task.part.logmgr.putline('processing loop
listening');
timer.isActive = TRUE;
when timer.tick do
StartImmediate();
when self.StartProcessing do
processing = TRUE;
start task proc.ProcessEvents() where completion =
event;
when proc.ProcessEvents_return do
task.part.logmgr.putline('ProcessEvents_return');
processing = FALSE;
when proc.ProcessEvents_exception do
task.part.logmgr.putline('ProcessEvents_exception');
processing = FALSE;
when task.shutdown do
exit;
end event;
end method;
method SomeService2.StartImmediate
begin
task.part.logmgr.putline(task.traceBack());
post StartProcessing;
end method;
end CLASS;
PROCESSOR CLASS
begin CLASS;
class Processor inherits from Framework.Object
has public method Init;
has public method ProcessEvents where completion =
(return = ProcessEvents_return, exception =
ProcessEvents_exception);
has property
shared=(allow=off, override=on);
transactional=(allow=off, override=on);
monitored=(allow=off, override=on);
distributed=(allow=off, override=on);
end class;
method Processor.Init
begin
super.Init();
end method;
method Processor.ProcessEvents
begin
task.part.logmgr.putline('Start processing...');
task.Delay(msecs = 1500);
task.part.logmgr.putline('Processing complete.');
end method;
end CLASS;
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com
Yes, you're right. The return event is queued until the moment that you
actually enter an eventloop. I stand corrected.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
-----Original Message-----
From: Adamek, Zenon [mailto:ZAdamekpurolator.com]
Sent: Thursday, January 18, 2001 6:13 PM
To: Rottier, Pascal
Cc: 'forte-userslists.xpedior.com'
Subject: RE: (forte-users) Confusion with return event
I think it is always safe to use start task with where complition = event
clause before event loop. The reason is described in Forte Help in the
Complition Clause index:
"Requesting the return and exception events automatically registers the
events for the calling task. When the asynchronous method completes or
terminates, Forté adds the appropriate event to the calling task's event
queue.
This registration is unlike the event registration for the event statement.
In the event statement, the event is registered just before the event
statement is ready to process the event. In the start task statement, the
return and exception events are registered when the task is started, even
though it can be much later on that your application is prepared to wait for
those events. Therefore, only the "parent" task that executes the start task
statement is registered for the completion event of the started task."
and some comments from "Forte Performance and Patterns" page 18:
"When you use the where completion = event clause in the start task
statement, Forte automatically buffer the return event until you register
for it. Therefore, you do not need to worry about the child task completing
before you register for its return event".
Regards,
Zenon
-----Original Message-----
From: Rottier, Pascal [SMTP:Rottier.Pascalpmintl.ch]
Sent: Thursday, January 18, 2001 11:16 AM
To: 'Samer Kanjo'; ForteUsers
Subject: RE: (forte-users) Confusion with return event
Yes, if you want the eventloop of the service object to be informed when
the
method on the processor class is invoked, regardless of who invoked it,
then
you should simply post an event as the last statement inside the method on
the processor class.
The return events are only used to inform a partent task that a child-task
has completed. So, only the calling task receives the event, only if the
calling task is inside an event-loop at the moment the child-task
terminates
and only if there really is a child task (method started using "start task
Note, that the calling task doesn't have to be inside an event loop when
the
asynchronous call is made. It has to be inside an eventloop when the
asynchronous task terminates. The following piece of code works just as
well:
SomeService1.StartImmediate();
self.DoSomeOtherStuff();
event loop
when SomeService1.Proc.ProcessEvent_return do
task.Part.Logmgr.Putline('ProcessEvents_return');
when SomeService1.Proc.ProcessEvent_exception do
task.Part.Logmgr.Putline('ProcessEvents_exception');
end event;
However, if the asynchronous task started from within "StartImmediate"
finishes before the client gets a chance to enter its event loop, then
you're too late to catch the event. That's why it's safer to use the
"postregister" function, which makes sure a certain action is not started
untill all events from the event loop have been registered.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
-----Original Message-----
From: Samer Kanjo [mailto:skanjoyahoo.com]
Sent: Thursday, January 18, 2001 5:04 PM
To: ForteUsers
Subject: RE: (forte-users) Confusion with return event
Pascal,
So you are confirming that a return event can only be
received in an event loop if a task is started from
within that event loop.
After making your proposed changes I was able to
receive the return event in the window.
I originally wanted the SomeService event loop to
always receive the return event regardless of whether
or not StartImmediate is called by some other entity
or called when the timer ticks. It seems that the only
way to do this is with events. Is that correct?
Thank you for insight,
Samer Kanjo
--- "Rottier, Pascal" <Rottier.Pascalpmintl.ch>
wrote:
Samer,
The return event is delivered to the calling task,
which is the window in
your first test. It is not deliverd to the event
loop of the service object
unless the call to the processor originated in the
event loop, which is the
case in your second test. The output you get from
the server is exactly as I
would expect.
You need the following code in you client:
event loop
postregister
SomeService1.StartImmediate();
when SomeService1.Proc.ProcessEvent_return do
task.Part.Logmgr.Putline('ProcessEvents_return');
when SomeService1.Proc.ProcessEvent_exception do
task.Part.Logmgr.Putline('ProcessEvents_exception');
end event;
Note that this logoutput will not be written to a
logfile, but will appear
in the logwindow which is opened when you start a
client application.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch--
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com
Similar Messages
-
New Nike+ user - Confused with Calibration?
I am a new user, and so far, have been impressed with my new running toy, but I am somewhat confused about calibrating the device. Wanting the sensor to be as accurate as possible, I have been reading countless discussions on different forums about the best way to calibrate, only to be left even more perplexed by the difference in opinions.
I use the gym regularly - manily the treadmill and calibrated my nike+ sensor using this, as I had no access to a Athletics Track. The calibration was successful, and seemed to be accurate compared to the treadmill stats. Now I have read that if you calibrate the sendsor on a treadmill, it will not be accurate when running outside?? I plan to start running outside, as the weather is improving, and want it to be accurate - does anyone have a suggestion to how to callibrate without using a track? I live in oxford and cant find any free running tracks to use so am a bit stuck..... please help!Well I'm from Oxford too! and I used the Horspath Track. They are pretty cool about people using it for free and the caretaker even said he didn't mind me hopping the fence if I wanted to use it in the evening when it was closed...
The main thing is that people tend to run differently outside as oppose to the treadmill. The stride length makes a big difference for me,
-Jake -
Return event with parameters ?
Hi Forte-users !
I have to call a method of a Service Object and I want to know when the task is completed.
I have to react differently according to a parameter of the method.
I want that only I receive the event.
I tried different things :
1. With differents events
=========================
In MySO.Mymethod :
IF MyParam = 1 THEN
POST MyEvent1;
ELSE
POST MyEvent2;
END IF;
In my main method :
start task MySO.Mymethod(MyParam)
WHEN MySO.MyEvent1 DO
WHEN MySO.MyEvent2 DO
When I post different events according to MyParam in MyMethod, all users receive this event.
2. With a return event
======================
start task MySO.Mymethod(MyParam) when completion = event
When MySO.MyEvent DO
When I use a return event, I only receive the event but I can't react differently according to MyParam.
Is it possible to define a parameter for MyEvent ? How ?
If not, does anybody see what I could do ?
Thanks,
Solen Boureau
__^__ __^__
| / | Solen Boureau | \ |
| / | Siemens AG Austria | \ |
| / | PSE NLT2 tel: (+43-1) 1707 - 47072 | \ |
| / | Gudrunstr. 11 fax: (+43-1) 1707 - 56256 | \ |
|___| A-1100 Wien email: [email protected] |___|
^ ^You can use method 1 but instead of posting the event, call a method on an
object that you pass from the client to the SO. You have to anchor that
object and I can't recall the exact procedures to do that. This will allow
you to just notify the client that started the method - not all clients.
Good Luck,
Tony Elmore
MSF&W
Springfield, IL
(217) 698-3535
[email protected]
From: Boureau PSE NLT <[email protected]>
To: [email protected]
Cc: [email protected]
Subject: return event with parameters ?
Date: Friday, March 07, 1997 9:46 AM
Hi Forte-users !
I have to call a method of a Service Object and I want to know when thetask is completed.
I have to react differently according to a parameter of the method.
I want that only I receive the event.
I tried different things :
1. With differents events
=========================
In MySO.Mymethod :
IF MyParam = 1 THEN
POST MyEvent1;
ELSE
POST MyEvent2;
END IF;
In my main method :
start task MySO.Mymethod(MyParam)
WHEN MySO.MyEvent1 DO
WHEN MySO.MyEvent2 DO
When I post different events according to MyParam in MyMethod, all usersreceive this event.
>
>
2. With a return event
======================
start task MySO.Mymethod(MyParam) when completion = event
When MySO.MyEvent DO
When I use a return event, I only receive the event but I can't reactdifferently according to MyParam.
Is it possible to define a parameter for MyEvent ? How ?
If not, does anybody see what I could do ?
Thanks,
Solen Boureau
__^__ __^__
| / | Solen Boureau | \ |
| / | Siemens AG Austria | \ |
| / | PSE NLT2 tel: (+43-1) 1707 - 47072 | \ |
| / | Gudrunstr. 11 fax: (+43-1) 1707 - 56256 | \ |
|___| A-1100 Wien email: [email protected] |___|
^ ^ -
RE: (forte-users) Events in Interface
I know, I've implemented similar structures in other locations as well,
always without problems. I've even recreated the whole interface, building
it completely from dragging and dropping methods and events from the class
to the interface. Then I did a force compile of the whole workspace. It
still doesn't solve the problem. There must be some combination of things
that were different in the other circumstances, but I don't seem to be able
to find it. It's definately not an error in the code. There something wrong
in Forte internally, but I don't know which combination of factors causes
it.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
-----Original Message-----
From: Moris_Mihaildis/AUST/CSCcsc.com
[mailto:Moris_Mihaildis/AUST/CSCcsc.com]
Sent: Tuesday, April 03, 2001 5:00 AM
To: Rottier, Pascal
Cc: forte-userslists.xpedior.com
Subject: Re: (forte-users) Events in Interface
FYI. We are using Forte 3.0.J.4 and NT4.0 SP6, and have had no problems
implementing your pattern.
There should be no need for a fix (cast). There is something wrong with
your interface.
Regards,
Moris Mihailidis
Consulting
CSC
Level 4, 570 St. Kilda Road, Melbourne VIC 3004
Ph: 61-3-95364675 Fax: 61-3-95364633 Email: mmihailicsc.com.au
"Rottier, Pascal" <Rottier.Pascalpmintl.ch> on 04/02/2001 09:52:46 PM
To: "'Forte Users'" <forte-userslists.xpedior.com>
cc:
Subject: (forte-users) Events in Interface
We have the following scenario:
There is a Service Object that acts as a Facade (Facade pattern) for 3
manager classes that implement some business functions. Each of these three
managers are stored as private attributes on this Service Object.
For the sake of flexibility, these three private attributes are defined by
their Interface, not their class. When the Service Object opens an Event
Loop and registers for the events of one of these interfaces, the whole
partition crashes. Even when using the running man in the development
workshop, the whole partition crashes. The only way to fix that is to cast
the Interface to a class that implements the interface before registering
for the event.
I know it's possible to register for events using an Interface that
contains
these events, rather then a class that implements the events. Of course, at
runtime you do need a real instance of a class that implements the
interface, otherwise you get a NIL-exception.
Does anyone have any experience registering for events from Interfaces? Are
there unexpected circumstances where it should work semantically, but still
causes Forte to crash. We're using Forte 3.j.1 on NT 4.0 SP 6.
Any help is appreciated.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.comI know, I've implemented similar structures in other locations as well,
always without problems. I've even recreated the whole interface, building
it completely from dragging and dropping methods and events from the class
to the interface. Then I did a force compile of the whole workspace. It
still doesn't solve the problem. There must be some combination of things
that were different in the other circumstances, but I don't seem to be able
to find it. It's definately not an error in the code. There something wrong
in Forte internally, but I don't know which combination of factors causes
it.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
-----Original Message-----
From: Moris_Mihaildis/AUST/CSCcsc.com
[mailto:Moris_Mihaildis/AUST/CSCcsc.com]
Sent: Tuesday, April 03, 2001 5:00 AM
To: Rottier, Pascal
Cc: forte-userslists.xpedior.com
Subject: Re: (forte-users) Events in Interface
FYI. We are using Forte 3.0.J.4 and NT4.0 SP6, and have had no problems
implementing your pattern.
There should be no need for a fix (cast). There is something wrong with
your interface.
Regards,
Moris Mihailidis
Consulting
CSC
Level 4, 570 St. Kilda Road, Melbourne VIC 3004
Ph: 61-3-95364675 Fax: 61-3-95364633 Email: mmihailicsc.com.au
"Rottier, Pascal" <Rottier.Pascalpmintl.ch> on 04/02/2001 09:52:46 PM
To: "'Forte Users'" <forte-userslists.xpedior.com>
cc:
Subject: (forte-users) Events in Interface
We have the following scenario:
There is a Service Object that acts as a Facade (Facade pattern) for 3
manager classes that implement some business functions. Each of these three
managers are stored as private attributes on this Service Object.
For the sake of flexibility, these three private attributes are defined by
their Interface, not their class. When the Service Object opens an Event
Loop and registers for the events of one of these interfaces, the whole
partition crashes. Even when using the running man in the development
workshop, the whole partition crashes. The only way to fix that is to cast
the Interface to a class that implements the interface before registering
for the event.
I know it's possible to register for events using an Interface that
contains
these events, rather then a class that implements the events. Of course, at
runtime you do need a real instance of a class that implements the
interface, otherwise you get a NIL-exception.
Does anyone have any experience registering for events from Interfaces? Are
there unexpected circumstances where it should work semantically, but still
causes Forte to crash. We're using Forte 3.j.1 on NT 4.0 SP 6.
Any help is appreciated.
Pascal Rottier
Atos Origin Nederland (BAS/West End User Computing)
Tel. +31 (0)10-2661223
Fax. +31 (0)10-2661199
E-mail: Pascal.Rottiernl.origin-it.com
++++++++++++++++++++++++++++
Philip Morris (Afd. MIS)
Tel. +31 (0)164-295149
Fax. +31 (0)164-294444
E-mail: Rottier.Pascalpmintl.ch
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
RE: (forte-users) returning variants from OLE methodcalls
I'm getting an error when calling an OLE method which
requires two VARIANT
parameters, one input and one output. Both parameters are treated as
arrays
by the OLE method.
Error during Invoke; status code: -2147352562(0x8002000E)This error is "Invalid Number of Parameters"
The code itself, I cannot really comment on as I have had very little
experience with COM objects
Cheers
David McPaul
Lumley Technology
This message has been Content Filtered by MailMarshal.
---------------------------------------------------------------------As an FYI, to find out what the error message means, you can take the hex
number (in this case 0x8002000E) and search through the winerror.h file.
That will give you a better idea of what the actual problem is.
Katie Tierney
Akili Systems Group
601 Jefferson, Suite 3975
Houston, Texas 77002
Office: (713) 655-1400
Cell: (409) 255-1643
"The bitterness of poor quality remains long after the sweetness of low
price is forgotten" --Larry Anderson
-----Original Message-----
From: David McPaul [mailto:dmcpaullumley.com.au]
Sent: Tuesday, March 07, 2000 5:27 PM
To: 'Isaak Peretsman'; forte-userslists.xpedior.com
Subject: RE: (forte-users) returning variants from OLE method calls
I'm getting an error when calling an OLE method which
requires two VARIANT
parameters, one input and one output. Both parameters are treated as
arrays
by the OLE method.
Error during Invoke; status code: -2147352562(0x8002000E)This error is "Invalid Number of Parameters"
The code itself, I cannot really comment on as I have had very little
experience with COM objects
Cheers
David McPaul
Lumley Technology
This message has been Content Filtered by MailMarshal.
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
RE: [forte-users] Version L Clients working with Version NServer Partit
we were not able to get this combination to work, for some reason, our cache
was not loading when we do this.
suma
-----Original Message-----
From: Bill Bhatta [mailto:[email protected]]
Sent: Wednesday, May 30, 2001 3:04 PM
To: [email protected]
Cc: Ravi; Kent Smith; John Werry
Subject: [forte-users] Version L Clients working with Version N Server
Partitions
My "L" clients are successfully communicationg with a
3.5 server partition. Anyone else doing this? Any
potential problems I need to look out for?
Bill
a year! http://personal.mail.yahoo.com/
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: [email protected]we were not able to get this combination to work, for some reason, our cache
was not loading when we do this.
suma
-----Original Message-----
From: Bill Bhatta [mailto:[email protected]]
Sent: Wednesday, May 30, 2001 3:04 PM
To: [email protected]
Cc: Ravi; Kent Smith; John Werry
Subject: [forte-users] Version L Clients working with Version N Server
Partitions
My "L" clients are successfully communicationg with a
3.5 server partition. Anyone else doing this? Any
potential problems I need to look out for?
Bill
a year! http://personal.mail.yahoo.com/
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: [email protected] -
RE: (forte-users) Posted Event Not Seen by EventLoop
Hi,
Event registration occurs when an event loop is activated. If your event
loop is activated before your SO is ready and registered (Init must be
finished) the event loop will be not registered for the event on your SO.
This is a typical example of race condition. A race condition may occur when
two or more processes execute simultaneously and the final result depends on
which process finishes first. Please redesign your project.
Regards,
Zenon Adamek
Purolator
-----Original Message-----
From: Denver Jobs [SMTP:fortejobsindenveryahoo.com]
Sent: Wednesday, June 14, 2000 2:48 PM
To: kamranaminyahoo.com
Subject: (forte-users) Posted Event Not Seen by Event Loop
I have two classes & an SO in a given project.
ManagerClass : object
InterfaceClass : object
ManagerSO : ManagerClass
ManagerClass has the attribute
theInterfaceClass : InterfaceClass
InterfaceClass has the attribute
theManagerClass : Manager Class
The ManagerClass Init method performs a new on
theInterfaceClass and then does a start task on a
method within theInterfaceClass which starts an
external connection listening on a port.
The method also sets theInterfaceClass.theManagerClass
to ManagerSO.
A method gets called in the ManagerClass which writes
to the external connection port within the
theInterfaceClass and then starts an event loop in the
ManagerClass to wait for notification.
When the started task for listening on the external
connection receives data, it calls a method within the
ClassManager - theClassManager.CallMethod(returndata);
The CallMethod actually posts an event within the
ClassManager which the event loop started earlier is
waiting on.
The event does get posted, however, the event loop
that was started never receives the event?!?!?
There are no lower level event loops that
should trap this event prior to this point.
The call to perform the "write" on the external
connection is done as a postregister in the event
loop, so that the event is registered before a post
for the event occurs.
Am I missing something here?
Thanks in advance for any light you might shed.
Yahoo! Photos -- now, 100 FREE prints!
http://photos.yahoo.com
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.comCheck if ManagerSO = ManagerSO.theInterfaceClass.theManagerClass
Why does InterfaceClass call a methon the the SO? Why doesn't it simply post
its own event, that the SO is registered for?
-----Original Message-----
From: Denver Jobs [SMTP:fortejobsindenveryahoo.com]
Sent: Wednesday, June 14, 2000 8:48 PM
To: kamranaminyahoo.com
Subject: (forte-users) Posted Event Not Seen by Event Loop
I have two classes & an SO in a given project.
ManagerClass : object
InterfaceClass : object
ManagerSO : ManagerClass
ManagerClass has the attribute
theInterfaceClass : InterfaceClass
InterfaceClass has the attribute
theManagerClass : Manager Class
The ManagerClass Init method performs a new on
theInterfaceClass and then does a start task on a
method within theInterfaceClass which starts an
external connection listening on a port.
The method also sets theInterfaceClass.theManagerClass
to ManagerSO.
A method gets called in the ManagerClass which writes
to the external connection port within the
theInterfaceClass and then starts an event loop in the
ManagerClass to wait for notification.
When the started task for listening on the external
connection receives data, it calls a method within the
ClassManager - theClassManager.CallMethod(returndata);
The CallMethod actually posts an event within the
ClassManager which the event loop started earlier is
waiting on.
The event does get posted, however, the event loop
that was started never receives the event?!?!?
There are no lower level event loops that
should trap this event prior to this point.
The call to perform the "write" on the external
connection is done as a postregister in the event
loop, so that the event is registered before a post
for the event occurs.
Am I missing something here?
Thanks in advance for any light you might shed.
Yahoo! Photos -- now, 100 FREE prints!
http://photos.yahoo.com
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
Hi we setup ISE in our lab and planning for prodution with 2000 user endpoints. We have SNS appliance but confused with ISE license bt plus and advanced..Please advise.
Plus:
Bring Your Own Device (BYOD)
Profiling
Endpoint Protection Service (EPS)
TrustSec SGT
Advanced :
Bring Your Own Device (BYOD)
Profiling
Endpoint Protection Service (EPS)
TrustSec SGT
Mobile Device Manager (MDM)
Health Compliance and Remediation
Posture
Base license is Perpetual -
RE: (forte-users) Reading return value from Javaprogram
when using the RunCommand method you can specify the an error file:
task.part.os.RunCommand(command = l_tdCommandLine,
isSynchronous = TRUE,
inputFile = Nil,
outputFile = Nil,
errorFile = l_ErrorFile.GetLocalName(TRUE));
BEGIN
l_ErrorFile.Open(SP_AM_READ);
EXCEPTION
WHEN Ex: FileResourceException DO
l_ErrorFile = NIL;
task.ErrorMgr.Clear();
END;
IF l_ErrorFile <> NIL THEN
l_tdFileContents : TextData = New();
l_ErrorFile.ReadText(l_tdFileContents);
l_ErrorFile.Close();
END IF;
Have you java program output the return value to the standard IO. This way
you will have an error file that you can read from Forte.
ka
-----Original Message-----
From: Anthony D [mailto:saigonxyahoo.com]
Sent: Tuesday, September 12, 2000 7:49 AM
To: forte-userslists.xpedior.com
Subject: (forte-users) Reading return value from Java program
Hi,
Does anyone know whether Forte application can
read a return value from a Java program?
I'm using the RunCmd method to invoke the Java
program. I'd like to read the return value from the
Java program. How do I go about doing it?
Any suggestion will be appriciated.
Thanks
AD
http://mail.yahoo.com/
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.comwhen using the RunCommand method you can specify the an error file:
task.part.os.RunCommand(command = l_tdCommandLine,
isSynchronous = TRUE,
inputFile = Nil,
outputFile = Nil,
errorFile = l_ErrorFile.GetLocalName(TRUE));
BEGIN
l_ErrorFile.Open(SP_AM_READ);
EXCEPTION
WHEN Ex: FileResourceException DO
l_ErrorFile = NIL;
task.ErrorMgr.Clear();
END;
IF l_ErrorFile <> NIL THEN
l_tdFileContents : TextData = New();
l_ErrorFile.ReadText(l_tdFileContents);
l_ErrorFile.Close();
END IF;
Have you java program output the return value to the standard IO. This way
you will have an error file that you can read from Forte.
ka
-----Original Message-----
From: Anthony D [mailto:saigonxyahoo.com]
Sent: Tuesday, September 12, 2000 7:49 AM
To: forte-userslists.xpedior.com
Subject: (forte-users) Reading return value from Java program
Hi,
Does anyone know whether Forte application can
read a return value from a Java program?
I'm using the RunCmd method to invoke the Java
program. I'd like to read the return value from the
Java program. How do I go about doing it?
Any suggestion will be appriciated.
Thanks
AD
http://mail.yahoo.com/
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
RE: (forte-users) 3J= 3M new to me error
Hi Thomas,
Thanks for your email but I think it will be interesting for Brenda not me.
It is exactly what I have expected from Forte Support: detailed information
about bugs and workarounds. But what I cannot understand is that #53398 was
released without any information about possible reasons for this problem or
suggested workarounds. My first reaction after reading this bugreport was to
open a new case at CallCenter to get more information about it. Please
release more information with your bug reports !
Regards
Zenon Adamek
Information Services
Senior Programmer Analyst
Tel: 905 712-1084 ext. 3628
Fax: 905 712-6709
E-mail: zadamekpurolator.com
-----Original Message-----
From: Thomas Degen - Sun Germany Forte Tools - Bonn
[SMTP:thomas.degensun.com]
Sent: Wednesday, September 27, 2000 9:49 AM
To: Adamek, Zenon
Cc: 'Brenda Cumming'; Forte-userslists.xpedior.com
Subject: RE: (forte-users) 3J=>3M new to me error
Hi Zenon,
bug #53398 is not a bug which will likely get fixed, it's an informational
bugreport.
You might see an errorstack like Brenda has reported (and described in
informational
bugreport #53398) probably when you are doing something illegal that is
possible
via Forte Tool but Forte is not trapping it for performance reasons. Hence
you will see
the error coming from your illegal operation only at runtime, probably
only
while
running interpreted in the Forte IDE, but in worst case it might be even a
segmentation
violation.
Technotes 12448 'Sudden client partition crashes at runtime' and 11225
'Don't reparent
mapped Widgets between UserWindows at runtime' explain this matter . See
attached.
But maybe Brenda is much more experiencing a problem as described by Forte
Technote 11398 'Read Only Workspace Errors using ListViews or ActiveX
control'
that might get easily resolved via setting of FORTE_YIELD_THROTTLE=0.
Good Luck and Best Regards !
BTW: I've logged bug #53398, so I've felt responsible to explain its real
background.
Thomas
Thomas Degen
Sun Microsystems - Forte Tools
Forte CTE & Sustaining Group
Technical Support Germany
tel.:+49.228/91499-50
MailTo:thomas.degensun.com
Technote 11398 Read Only Workspace Errors using ListViews or ActiveX
control
SCENARIO:
Getting some unusual interpreter errors that result in an error stating
that
the workspace has been set to read only. Please see Enclosures for the
two
most common error stacks that have been encountered. The abbreviated
versions of the errors are:
- Can't read record (record size = -1)
- Id in index does not match id in record header in data file
- Recursive deserialization attempted.
- Unknown Mark type in deserialization
- Could not read record (64,74615) from repository data file.
Header
is corrupt.
These errors can be happening in either the development environment when
running from one of the development workshops, or with the deployed
application.
The bug outlined in this Technote may be the culprit if the errors above
are
seen when running a client on Windows NT or Motif and the user interface
incorporates ActiveX controls or ListView/TreeView widgets.
CAUSE:
Basically what is happening is that in rare circumstances Forte may invoke
a
nested copy of the interpreter while the first interpreter has yielded.
This
is not a problem in and of itself, but in the case where the original
interpreter was in the middle of a repository fetch when it yielded, and
the second interpreter needs to fetch code as well, we will get one of the
errors listed above, depending on the exact timing. The reason for the
errors is that the repository code at this level is thread-safe but not
re-entrant. It is protected by a mutex that is already owned by the
current task. Which, given the scenario outlined here, where the two
interpreters are running inside of the same task, results in the nested
interpreter being allowed to change data out from under the first.
While for every fetch one or more calls to WindowSystem.Yield will be made
(this is there to prevent the semblance of system lock-up on Win 3.1,
where
Yield is the only way other applications can be allowed to run), there is
a parameter which controls how often to actually yield, which by default
is
set to one out of every 100 calls. This is the reason the problem is
intermittent--you need a yield to occur during a repository fetch
which starts another interpreter which also needs to fetch code from
disk.
The reason this has only surfaced recently is that the nested interpreter
scenario can only happen in 2 cases that we know of:
- ActiveX controls which respond to events/Windows messages
- Outline fields/ListViews with column(s) mapped to virtual
attributes
In all other normal cases, the yield can process the message (typically a
paint message) without starting another interpreter, so regardless of
whether
the first interpreter yielded during a repository operation or not, there
is
no conflict.
SOLUTION:
The workaround is to prevent yields altogether by setting the
FORTE_YIELD_THROTTLE environment variable equal to 0 in the client's
environment. This should have no detrimental effects since the yield code
is in place solely for Windows 3.1x clients.
ERROR STACK 1
SYSTEM ERROR: Because of a prior error, your workspace was set to
read-only to
prevent the application from attempting to write to the repository. The
repository and work you have saved to the repository are safe. If your
workspace
contains unsaved work, you may use the following procedure to save this
work.
First, export the changed components. Then, shut down and restart this
application and reopen this workspace in read-write mode. Finally, import
the
changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 695]
Detected at: qqrp_Session::GetObjectById
Last TOOL statement: method EFWindowController.EFEventLoop
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
The remainder of the Error Manager stack is:
SYSTEM ERROR: Internal Error attempting to deserialize element (64,67470)
(fetch
bitmask is 0x20). Your workspace is now read-only to prevent the
application
from attempting to write to the repository. The repository and work you
have
saved to the repository are safe. If your workspace contains unsaved work,
you
may use the following procedure to save this work. First, export the
changed
components. Then, shut down and restart this application and reopen this
workspace in read-write mode. Finally, import the changed components and
save
your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 61]
Detected at: qqrp_LogicalSession::MaterializeObject
Last TOOL statement: method EFTabManagerNew.EFNoteBookHandler
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
SYSTEM ERROR: Unknown Mark type in deserialization.
Class: qqsp_ImplementationException
Error #: [1101, 34]
Detected at: qqrp_DeSerializeObject::ProcessHdr
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
ERROR STACK 2
SYSTEM ERROR: A serious error has occurred in Repository
(c:\PROGRA~1\CSSPTEST\conplu0). Corrective action may be necessary.
Notify
your repository administrator.
Class: qqsp_ImplementationException
Error #: [1101, 198]
Detected at: qqrp_Repository::Fetch
Last TOOL statement: method
SalesDevelopment_NWC.DEVNotifyofTabSetCurrent
Error Time: Wed Dec 03 10:27:22
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1,
taskId =
[769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1.22]) in application
"ConPlus_GUI_cl0", pid 172 on node ISD42 in environment Edge.
SYSTEM ERROR: Could not read record (64,74615) from repository data file.
Header is corrupt.
Class: qqsp_ImplementationException
Error #: [1106, 612]
Detected at: qqbt_BtreeAccess::FetchDataFileRecord
Error Time: Wed Dec 03 10:27:22
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1,
taskId =
[769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1.22]) in application
"ConPlus_GUI_cl0", pid 172 on node ISD42 in environment Edge.
Technote 11225 Don't reparent mapped Widgets between UserWindows at
runtime
It is sometimes tempting to unparent a widget from one UserWindow and
reparent
it into another at runtime. However, this can cause crashes if the widget
(or
its decendants) are "mapped" to data. Here's why...
Suppose you have two UserWindows, UW1 and UW2. UW1 contains a DataField
(DF1)
which is mapped to a TextData. UW2 contains a RadioList (RL2) which is
mapped to
a scalar Integer. At compile time, every mapped attribute is internally
assigned
a "Map ID" (a small integer) which is used to tie the Widget to its
corresponding attribute. These Map IDs are used by the Widget to look up a
pointer to their data in a "Map" which is maintained by the UserWindow.
Each
UserWindow is assumed be to independent of the others, so there is nothing
wrong
with Widgets in different UserWindows being assigned the same Map IDs.
In
this
case, let's assume that DF1 and RL2 both got assigned the same Map ID of
3. No
problem so far, since each lives in a separate UserWindow with a separate
map.
Now suppose at runtime the application "detaches" or unparents DF1 from
its
UserWindow and reparents it somewhere into UW2. When it comes time for DF1
to
paint itself the Display System it must ask the Runtime System for the
value of
DF1's mapped attribute. To do that it says "give me the value of the
TextData
for DF1. You'll find it in the Map for this UserWindow (UW1), and its Map
ID is
3". When the runtime system goes to do this it expects to find a TextData
in
this "slot" of the map, but instead it picks up the integer which is
mapped to
RL2. At best this leads to bad data being returned; more likely you get a
segfault and a crash.
If DF1 was not a mapped attribute (say, a Rectangle) there would be no
problem
because there is no data mapped to a Rectangle. If instead of moving DF1
you
created a brand new DataField on the fly there would be no problem,
because the
dynamic DataField would not have any Map ID and so couldn't conflict with
any
IDs in UW2.
So how do you solve this problem? This is exactly what Nested Windows are
all
about. While you can't move DF1 into the middle of UW2, you can nest
UW1.
This
works because UW1 brings its map with it, and when you access DF1 it knows
to
look up its value in UW1's map.
UserWindows are intended to be the "unit of compilabilty" that can be
nested
inside other UserWindows. It is dangerous to "transplant" anything from
inside
one UserWindow into another at runtime.
(Note that you can't avoid this problem by cloning DF1 because the MapID
gets
copied along with it, and the clone will fail in the same way.)
Further details explained in related technote 12448 'Sudden client
partition
crashes at runtime.'
Technote 12448 Sudden client partition crashes at runtime
Scenario : You have two UserWindows, A and B. When Window A starts up, it
instantiates an instance of B and reparents some component of B into A's
window
hierarchy.
This is not allowed and almost always leads to an error at best or at
worse a
segmentation fault.
Here's why :
When you compile a UserWindow in Forte, each "mapped attribute" (whether a
form
element or menu element) is assigned an internal ID which represents an
offset into
that UserWindow's table of mapped attributes. This offset is only valid
in the
context of the UserWindow in which it was compiled. If you detach a
FieldWidget or
MenuWidget from one compiled Window ("tmpMenu" for example) and then
parent
into another compiled window ("tmpWindow") the internal ID comes with it.
When Forte tries to make use of that copied widget it uses the ID as an
offset
into tmpWindow's table of mapped attributes. But that copied offset is
meaningless in the context of tmpWindow's table, so you get some kind off
error.
In this case it found that the data type of the variable in the slot
wasn't
what
was expected. But you might even index off the end of the table and get a
segmentation fault.
There is nothing to prevent you from dynamically creating menu items and
adding
them to a window at runtime; that will work fine. Although of course you
can't
access them via mapped attributes, since those can only be created at
compile time.
But you are not allowed to reparent a widget from one compiled UserWindow
into
the hierarchy of another.
More information may be found in technote 11225 'Don't reparent mapped
Widgets
between UserWindows at runtime'.
Possible errorstacks seen at runtime instead of a complete crash or
segmentation
violation while you are illegally reparenting a widget or menuitem between
windows
at runtime:
Map::SetSubjectData: Invalid conversion from map type 0 to subject type 22
SYSTEM ERROR: Bad parameter at location 3 in method
qqrt_MapClassAccess::ProcessSubjectData.
Class: qqsp_Exception
Error #: [1001, 381]
Detected at: qqrt_MapClassAccess::ProcessSubjectData at 3
Error Time: Wed Aug 09 13:03:57
Exception occurred (locally) on partition "testproject_CL0_Client",
(partitionId = D4914A10-36C1-11D4-91B3-419AA33BAA77:0x208:0xd,
taskId =
[D4914A10-36C1-11D4-91B3-419AA33BAA77:0x208:0xd.68]) in application
"FTLaunch_cl0", pid 672 on node ONEWAY in environment Audi3M2Env.
At 13:14 26.09.00 -0400, Adamek, Zenon wrote:
Hi,
It is the unfixed defect 53398. Please contact Forte support.
Zenon
-----Original Message-----
From: Brenda Cumming [SMTP:brenda_cummingtranscanada.com]
Sent: Tuesday, September 26, 2000 1:15 PM
To: Forte User group
Subject: (forte-users) 3J=>3M new to me error
Hi,
We are in the process of going from 3J1 to 3.0.M.2, and I am getting
this error that I am unfamiliar with on a GUI that works fine in 3J.
It
does not happen all the time, and I have been unable to establish the
pattern that kicks it off. Has anyone seen this before?
PS- this error is not occurring in the deployed (non-compiled) app,but
when I am running locally from my workspace.
SYSTEM ERROR: Bad parameter at location 6 in method
qqrt_MapClassAccess::ProcessSubjectData.
Class: qqsp_Exception
Error #: [1001, 381]
Detected at: qqrt_MapClassAccess::ProcessSubjectData at 6
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2,
taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Can't find scope 20070 for a class.
Class: qqsp_Exception
Error #: [201, 11]
Detected at: qqlo_ClassTableLoadScope at 1
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Because of a prior error, your workspace was set to
read-only to prevent the application from attempting to write to the repository.
The repository and work you have saved to the repository are safe. If
your
workspace contains unsaved work, you may use the following procedure
to save this work. First, export the changed components. Then, shut down and
restart this application and reopen this workspace in read-write mode.
Finally, import the changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 695]
Detected at: qqrp_Session::IsDistributed
Last TOOL statement: method PPMeasWin.
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Internal Error attempting to deserialize element
(64,120684) (fetch bitmask is 0x20). Your workspace is now read-onlyto
prevent
the application from attempting to write to the repository. The
repository
and work you have saved to the repository are safe. If your workspace
contains unsaved work, you may use the following procedure to savethis
work.
First, export the changed components. Then, shut down and restart this
application and reopen this workspace in read-write mode. Finally, import the
changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 61]
Detected at: qqrp_LogicalSession::MaterializeObject
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Recursive Deserialization attempted, Internal Error!
Class: qqsp_UsageException with ReasonCode: SP_ER_INVALIDSTATE
Error #: [301, 231]
Detected at: qqsp_DeSerializeDriver::Run at 1
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in anew
email the word: 'Unsubscribe' to:forte-users-requestlists.xpedior.com
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.comHi Thomas,
Thanks for your email but I think it will be interesting for Brenda not me.
It is exactly what I have expected from Forte Support: detailed information
about bugs and workarounds. But what I cannot understand is that #53398 was
released without any information about possible reasons for this problem or
suggested workarounds. My first reaction after reading this bugreport was to
open a new case at CallCenter to get more information about it. Please
release more information with your bug reports !
Regards
Zenon Adamek
Information Services
Senior Programmer Analyst
Tel: 905 712-1084 ext. 3628
Fax: 905 712-6709
E-mail: zadamekpurolator.com
-----Original Message-----
From: Thomas Degen - Sun Germany Forte Tools - Bonn
[SMTP:thomas.degensun.com]
Sent: Wednesday, September 27, 2000 9:49 AM
To: Adamek, Zenon
Cc: 'Brenda Cumming'; Forte-userslists.xpedior.com
Subject: RE: (forte-users) 3J=>3M new to me error
Hi Zenon,
bug #53398 is not a bug which will likely get fixed, it's an informational
bugreport.
You might see an errorstack like Brenda has reported (and described in
informational
bugreport #53398) probably when you are doing something illegal that is
possible
via Forte Tool but Forte is not trapping it for performance reasons. Hence
you will see
the error coming from your illegal operation only at runtime, probably
only
while
running interpreted in the Forte IDE, but in worst case it might be even a
segmentation
violation.
Technotes 12448 'Sudden client partition crashes at runtime' and 11225
'Don't reparent
mapped Widgets between UserWindows at runtime' explain this matter . See
attached.
But maybe Brenda is much more experiencing a problem as described by Forte
Technote 11398 'Read Only Workspace Errors using ListViews or ActiveX
control'
that might get easily resolved via setting of FORTE_YIELD_THROTTLE=0.
Good Luck and Best Regards !
BTW: I've logged bug #53398, so I've felt responsible to explain its real
background.
Thomas
Thomas Degen
Sun Microsystems - Forte Tools
Forte CTE & Sustaining Group
Technical Support Germany
tel.:+49.228/91499-50
MailTo:thomas.degensun.com
Technote 11398 Read Only Workspace Errors using ListViews or ActiveX
control
SCENARIO:
Getting some unusual interpreter errors that result in an error stating
that
the workspace has been set to read only. Please see Enclosures for the
two
most common error stacks that have been encountered. The abbreviated
versions of the errors are:
- Can't read record (record size = -1)
- Id in index does not match id in record header in data file
- Recursive deserialization attempted.
- Unknown Mark type in deserialization
- Could not read record (64,74615) from repository data file.
Header
is corrupt.
These errors can be happening in either the development environment when
running from one of the development workshops, or with the deployed
application.
The bug outlined in this Technote may be the culprit if the errors above
are
seen when running a client on Windows NT or Motif and the user interface
incorporates ActiveX controls or ListView/TreeView widgets.
CAUSE:
Basically what is happening is that in rare circumstances Forte may invoke
a
nested copy of the interpreter while the first interpreter has yielded.
This
is not a problem in and of itself, but in the case where the original
interpreter was in the middle of a repository fetch when it yielded, and
the second interpreter needs to fetch code as well, we will get one of the
errors listed above, depending on the exact timing. The reason for the
errors is that the repository code at this level is thread-safe but not
re-entrant. It is protected by a mutex that is already owned by the
current task. Which, given the scenario outlined here, where the two
interpreters are running inside of the same task, results in the nested
interpreter being allowed to change data out from under the first.
While for every fetch one or more calls to WindowSystem.Yield will be made
(this is there to prevent the semblance of system lock-up on Win 3.1,
where
Yield is the only way other applications can be allowed to run), there is
a parameter which controls how often to actually yield, which by default
is
set to one out of every 100 calls. This is the reason the problem is
intermittent--you need a yield to occur during a repository fetch
which starts another interpreter which also needs to fetch code from
disk.
The reason this has only surfaced recently is that the nested interpreter
scenario can only happen in 2 cases that we know of:
- ActiveX controls which respond to events/Windows messages
- Outline fields/ListViews with column(s) mapped to virtual
attributes
In all other normal cases, the yield can process the message (typically a
paint message) without starting another interpreter, so regardless of
whether
the first interpreter yielded during a repository operation or not, there
is
no conflict.
SOLUTION:
The workaround is to prevent yields altogether by setting the
FORTE_YIELD_THROTTLE environment variable equal to 0 in the client's
environment. This should have no detrimental effects since the yield code
is in place solely for Windows 3.1x clients.
ERROR STACK 1
SYSTEM ERROR: Because of a prior error, your workspace was set to
read-only to
prevent the application from attempting to write to the repository. The
repository and work you have saved to the repository are safe. If your
workspace
contains unsaved work, you may use the following procedure to save this
work.
First, export the changed components. Then, shut down and restart this
application and reopen this workspace in read-write mode. Finally, import
the
changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 695]
Detected at: qqrp_Session::GetObjectById
Last TOOL statement: method EFWindowController.EFEventLoop
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
The remainder of the Error Manager stack is:
SYSTEM ERROR: Internal Error attempting to deserialize element (64,67470)
(fetch
bitmask is 0x20). Your workspace is now read-only to prevent the
application
from attempting to write to the repository. The repository and work you
have
saved to the repository are safe. If your workspace contains unsaved work,
you
may use the following procedure to save this work. First, export the
changed
components. Then, shut down and restart this application and reopen this
workspace in read-write mode. Finally, import the changed components and
save
your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 61]
Detected at: qqrp_LogicalSession::MaterializeObject
Last TOOL statement: method EFTabManagerNew.EFNoteBookHandler
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
SYSTEM ERROR: Unknown Mark type in deserialization.
Class: qqsp_ImplementationException
Error #: [1101, 34]
Detected at: qqrp_DeSerializeObject::ProcessHdr
Error Time: Tue Nov 18 15:58:47
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1,
taskId =
[7EFAE060-4AFA-11D1-A1C1-1FDC8A99AA77:0x446:0x1.23]) in application
"ConPlus_GUI_cl0", pid 147 on node ISD060 in environment EdgeTest.
ERROR STACK 2
SYSTEM ERROR: A serious error has occurred in Repository
(c:\PROGRA~1\CSSPTEST\conplu0). Corrective action may be necessary.
Notify
your repository administrator.
Class: qqsp_ImplementationException
Error #: [1101, 198]
Detected at: qqrp_Repository::Fetch
Last TOOL statement: method
SalesDevelopment_NWC.DEVNotifyofTabSetCurrent
Error Time: Wed Dec 03 10:27:22
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1,
taskId =
[769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1.22]) in application
"ConPlus_GUI_cl0", pid 172 on node ISD42 in environment Edge.
SYSTEM ERROR: Could not read record (64,74615) from repository data file.
Header is corrupt.
Class: qqsp_ImplementationException
Error #: [1106, 612]
Detected at: qqbt_BtreeAccess::FetchDataFileRecord
Error Time: Wed Dec 03 10:27:22
Exception occurred (locally) on partition "ConPlus_GUI_cl0_Client",
(partitionId = 769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1,
taskId =
[769D4310-6B88-11D1-84FD-65BF87C8AA77:0x121:0x1.22]) in application
"ConPlus_GUI_cl0", pid 172 on node ISD42 in environment Edge.
Technote 11225 Don't reparent mapped Widgets between UserWindows at
runtime
It is sometimes tempting to unparent a widget from one UserWindow and
reparent
it into another at runtime. However, this can cause crashes if the widget
(or
its decendants) are "mapped" to data. Here's why...
Suppose you have two UserWindows, UW1 and UW2. UW1 contains a DataField
(DF1)
which is mapped to a TextData. UW2 contains a RadioList (RL2) which is
mapped to
a scalar Integer. At compile time, every mapped attribute is internally
assigned
a "Map ID" (a small integer) which is used to tie the Widget to its
corresponding attribute. These Map IDs are used by the Widget to look up a
pointer to their data in a "Map" which is maintained by the UserWindow.
Each
UserWindow is assumed be to independent of the others, so there is nothing
wrong
with Widgets in different UserWindows being assigned the same Map IDs.
In
this
case, let's assume that DF1 and RL2 both got assigned the same Map ID of
3. No
problem so far, since each lives in a separate UserWindow with a separate
map.
Now suppose at runtime the application "detaches" or unparents DF1 from
its
UserWindow and reparents it somewhere into UW2. When it comes time for DF1
to
paint itself the Display System it must ask the Runtime System for the
value of
DF1's mapped attribute. To do that it says "give me the value of the
TextData
for DF1. You'll find it in the Map for this UserWindow (UW1), and its Map
ID is
3". When the runtime system goes to do this it expects to find a TextData
in
this "slot" of the map, but instead it picks up the integer which is
mapped to
RL2. At best this leads to bad data being returned; more likely you get a
segfault and a crash.
If DF1 was not a mapped attribute (say, a Rectangle) there would be no
problem
because there is no data mapped to a Rectangle. If instead of moving DF1
you
created a brand new DataField on the fly there would be no problem,
because the
dynamic DataField would not have any Map ID and so couldn't conflict with
any
IDs in UW2.
So how do you solve this problem? This is exactly what Nested Windows are
all
about. While you can't move DF1 into the middle of UW2, you can nest
UW1.
This
works because UW1 brings its map with it, and when you access DF1 it knows
to
look up its value in UW1's map.
UserWindows are intended to be the "unit of compilabilty" that can be
nested
inside other UserWindows. It is dangerous to "transplant" anything from
inside
one UserWindow into another at runtime.
(Note that you can't avoid this problem by cloning DF1 because the MapID
gets
copied along with it, and the clone will fail in the same way.)
Further details explained in related technote 12448 'Sudden client
partition
crashes at runtime.'
Technote 12448 Sudden client partition crashes at runtime
Scenario : You have two UserWindows, A and B. When Window A starts up, it
instantiates an instance of B and reparents some component of B into A's
window
hierarchy.
This is not allowed and almost always leads to an error at best or at
worse a
segmentation fault.
Here's why :
When you compile a UserWindow in Forte, each "mapped attribute" (whether a
form
element or menu element) is assigned an internal ID which represents an
offset into
that UserWindow's table of mapped attributes. This offset is only valid
in the
context of the UserWindow in which it was compiled. If you detach a
FieldWidget or
MenuWidget from one compiled Window ("tmpMenu" for example) and then
parent
into another compiled window ("tmpWindow") the internal ID comes with it.
When Forte tries to make use of that copied widget it uses the ID as an
offset
into tmpWindow's table of mapped attributes. But that copied offset is
meaningless in the context of tmpWindow's table, so you get some kind off
error.
In this case it found that the data type of the variable in the slot
wasn't
what
was expected. But you might even index off the end of the table and get a
segmentation fault.
There is nothing to prevent you from dynamically creating menu items and
adding
them to a window at runtime; that will work fine. Although of course you
can't
access them via mapped attributes, since those can only be created at
compile time.
But you are not allowed to reparent a widget from one compiled UserWindow
into
the hierarchy of another.
More information may be found in technote 11225 'Don't reparent mapped
Widgets
between UserWindows at runtime'.
Possible errorstacks seen at runtime instead of a complete crash or
segmentation
violation while you are illegally reparenting a widget or menuitem between
windows
at runtime:
Map::SetSubjectData: Invalid conversion from map type 0 to subject type 22
SYSTEM ERROR: Bad parameter at location 3 in method
qqrt_MapClassAccess::ProcessSubjectData.
Class: qqsp_Exception
Error #: [1001, 381]
Detected at: qqrt_MapClassAccess::ProcessSubjectData at 3
Error Time: Wed Aug 09 13:03:57
Exception occurred (locally) on partition "testproject_CL0_Client",
(partitionId = D4914A10-36C1-11D4-91B3-419AA33BAA77:0x208:0xd,
taskId =
[D4914A10-36C1-11D4-91B3-419AA33BAA77:0x208:0xd.68]) in application
"FTLaunch_cl0", pid 672 on node ONEWAY in environment Audi3M2Env.
At 13:14 26.09.00 -0400, Adamek, Zenon wrote:
Hi,
It is the unfixed defect 53398. Please contact Forte support.
Zenon
-----Original Message-----
From: Brenda Cumming [SMTP:brenda_cummingtranscanada.com]
Sent: Tuesday, September 26, 2000 1:15 PM
To: Forte User group
Subject: (forte-users) 3J=>3M new to me error
Hi,
We are in the process of going from 3J1 to 3.0.M.2, and I am getting
this error that I am unfamiliar with on a GUI that works fine in 3J.
It
does not happen all the time, and I have been unable to establish the
pattern that kicks it off. Has anyone seen this before?
PS- this error is not occurring in the deployed (non-compiled) app,but
when I am running locally from my workspace.
SYSTEM ERROR: Bad parameter at location 6 in method
qqrt_MapClassAccess::ProcessSubjectData.
Class: qqsp_Exception
Error #: [1001, 381]
Detected at: qqrt_MapClassAccess::ProcessSubjectData at 6
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2,
taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Can't find scope 20070 for a class.
Class: qqsp_Exception
Error #: [201, 11]
Detected at: qqlo_ClassTableLoadScope at 1
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Because of a prior error, your workspace was set to
read-only to prevent the application from attempting to write to the repository.
The repository and work you have saved to the repository are safe. If
your
workspace contains unsaved work, you may use the following procedure
to save this work. First, export the changed components. Then, shut down and
restart this application and reopen this workspace in read-write mode.
Finally, import the changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 695]
Detected at: qqrp_Session::IsDistributed
Last TOOL statement: method PPMeasWin.
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Internal Error attempting to deserialize element
(64,120684) (fetch bitmask is 0x20). Your workspace is now read-onlyto
prevent
the application from attempting to write to the repository. The
repository
and work you have saved to the repository are safe. If your workspace
contains unsaved work, you may use the following procedure to savethis
work.
First, export the changed components. Then, shut down and restart this
application and reopen this workspace in read-write mode. Finally, import the
changed components and save your workspace.
Class: qqrp_RepResourceException
Error #: [1101, 61]
Detected at: qqrp_LogicalSession::MaterializeObject
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition
"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
SYSTEM ERROR: Recursive Deserialization attempted, Internal Error!
Class: qqsp_UsageException with ReasonCode: SP_ER_INVALIDSTATE
Error #: [301, 231]
Detected at: qqsp_DeSerializeDriver::Run at 1
Error Time: Wed Sep 20 14:32:54
Exception occurred (locally) on partition"ABSDevtStartUp_CL0_Client",
(partitionId = 36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2, taskId =
[36172000-5DA8-11D4-B1F0-14015EDAAA77:0x2da:0x2.25]) in
application
"Forte_cl0", pid 93 on node T5621 in environment AbisDMEnv.
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in anew
email the word: 'Unsubscribe' to:forte-users-requestlists.xpedior.com
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
Re: (forte-users) Delays in data transfer..server-to-client
I would try using DOM (distributed object manager) traces. trc:do:20 will
give you information on each messages sent from and received by the
partition. Levels are 1, 2, 5, 7, and 8, and trc:do:*:8 is very
verbose. trc:do:20:1 may tell you what you want to know. trc:do:1:1 will
give you a basic 1-line-per DOM event trace that may also be all you need.
Communications manager traces will tell you about network and socket-level
activity, but not about the sizes of the messages themselves. In addition,
the operating system makes decisions about physical packet size and
send/receive timing, so CM activities only generally map to actual network
activity.
-tdc
iPlanet Integration Server Engineering
At 09:24 AM 5/1/01 -0700, you wrote:
All,
We are experiencing delays in object transfer between server and client. The
delays are longer with large objects (a single object with an array of objects
that reflect the rows returned in a database) than small (ie: 10 rows vs 400).
Does anyone have any (actual) experience using the various Forte' flags in
order
to show the actual size of the object/packets being passed between the server
and client?
We are using input/output between client and server, input on all the SO's
within a partition. Response on the server side is good, roughly 6 seconds or
so. The round trip fare however from the time the client makes the SO call to
the time that it completes is in the 25-30 second range, leaving roughly 20-25
seconds unaccounted for. I have brought in the network guys who are
requesting
the data size and packet information. I did not see what I am looking for
using
the trc:cm:*:4 and trc:cm:*:8 flags. I will be trying the trc:cm:*:10
flag, but
Forte' indicates that this flag is very verbose, the systems group hates
it when
I use up all of THEIR disk space!
Any ideas would be appreciated as always.Jeff,
If the object you are passing does not require changes made to it in the
server partition to be returned, pass the object as copy input (pass by
value not reference). If it is necessary to pass the object as input, try
to pass only the attributes that are required to the remote partition
instead of the whole object.
Input/Output is normaly used with scalar variables. When a scalar is passed
to a remote partition, if the value is changed in that partition, the value
is not returned to the calling partition unless Input/Output is used.
Input/Output should not be used for object type parameters, if you need to
pass a reference, use Input only. If you can pass by value, use Copy Input.
You will notice a huge difference in performance changing from Input to Copy
input when passing large objects.
Hope this helps,
Travis Foote
Fortedeveloper.com Inc.
----- Original Message -----
From: "Jeff Bennett" <[email protected]>
To: <[email protected]>
Sent: Tuesday, May 01, 2001 9:24 AM
Subject: (forte-users) Delays in data transfer.. server-to-client
>
All,
We are experiencing delays in object transfer between server and client.The
delays are longer with large objects (a single object with an array ofobjects
that reflect the rows returned in a database) than small (ie: 10 rows vs400).
>
Does anyone have any (actual) experience using the various Forte' flags inorder
to show the actual size of the object/packets being passed between theserver
and client?
We are using input/output between client and server, input on all the SO's
within a partition. Response on the server side is good, roughly 6seconds or
so. The round trip fare however from the time the client makes the SOcall to
the time that it completes is in the 25-30 second range, leaving roughly20-25
seconds unaccounted for. I have brought in the network guys who arerequesting
the data size and packet information. I did not see what I am looking forusing
the trc:cm:*:4 and trc:cm:*:8 flags. I will be trying the trc:cm:*:10flag, but
Forte' indicates that this flag is very verbose, the systems group hatesit when
I use up all of THEIR disk space!
Any ideas would be appreciated as always.
-jeff
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: [email protected] -
RE: (forte-users) Forte ADE
In addition to this confusion, I'd like to see some statement by Forte to
indicate
WHEN the next Forte R4 is scheduled (before the Sun era is was said to be
Summer 2000) and
WHAT exactly it will contain (major headings will do).
With the cancellation of the Forte Forum event doubt and uncertainty are
spreading in the
Forte communities that I talk with and no one seems to counterbalance these
doubts with an
official statement. How serious does Sun take TOOL Forte for the coming few
years? Release
of Fusion V2 seems to say "serious". The deafning silence with regard to R4
indicates the
opposite. And the users are divided (as always).
Theo de Klerk
Architecture & Application Integration
Professional Services
Compaq Computer Corp. - the Netherlands
-----Original Message-----
From: Rottier, Pascal [mailto:Rottier.Pascalpmintl.ch]
Sent: Tuesday, 18 April, 2000 17:49
To: 'kamranaminyahoo.com'
Subject: (forte-users) Forte ADE
A long, long time ago
In a galaxy far away....
I saw a demonstration of Forte's new Application Development
Environment,
which was more userfriendly than the current one. It also looked more
similar to the interface of the other development tools out
there, with a
tree structure and capabilities to browse through the
inheritance tree, and
not opening a new window for every project, class and method that is
accessed.
This new interface was supposed to be included in Forte 4, which would
combine TOOL and Java and would be released soon.
Since then, we've seen SynerJ and now FJEE, but Forte 4 is still not
released. And when it will be released, it still won't
support TOOL and Java
simultaneously. That's OK. I understand that.
But now I've heard that this improved ADE won't even be
included in Forte 4.
Is this true? And if so, why?
Pascal
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe,
send in a new
email the word: 'Unsubscribe' to:
forte-users-requestlists.xpedior.comYou may be interested in the following which comes from a statement of direction
recently issued by Sun.
Product Context
+ Forté 4GL is an award-winning, proven product with many unique advantages for
building
enterprise business systems that are distributed, that involve the integration
of existing
business systems as well as new functionality, and that target heterogeneous
runtime
environments.
+ Forté 4GL is recognized by Gartner Group as the most successful Enterprise
Application
Development Tool.
+ Forte 4GL has a substantial customer base that has been successful with the
product and that
looks forward to using Forté 4GL for new applications.
+ The Sun Microsystems, Inc. (SMI) development tools group (formerly Forté
Software, Inc.)
has a strong internal commitment to Forté 4GL. Forté Fusion is written with, and
is currently
being enhanced with Forté 4GL.
+ SMI has retained the Forté field sales organization as an independent unit
whose primary
product offerings are Forté 4GL and Forté Fusion. Continued volume sales of
Forté 4GL
remain the foundation of our business plan.
Product Future
+ We intend to actively enhance and promote Forté 4GL for the indefinite
future.
+ We believe Forté 4GL will flourish in the long term, especially if we are
able to harness the
considerable selling power of the entire SMI field sales organization. To make
the product
more attractive and easier to sell, we will continue to make the product more
modular and
easier to integrate with heterogeneous software environments.
+ We believe that the best opportunity for attracting new customers is to
leverage the ability of
Forté 4GL to easily build powerful shared business services (server components)
that can be
accessed by non-Forté clients (e.g., browsers, Java clients) and that can easily
integrate with
new and existing business systems.
+ We believe that Forté 4GL?s continued success is enhanced by continuing to
issue small and
frequent product releases. Our target is two such releases per year.
+ There is a great potential for our three product lines (Forté 4GL, Forté
Fusion, and Forté for
Java) to complement and reinforce each other. Interoperability among the three
product lines
is seen as a critical success factor for Forté 4GL.
Forte 4GL Statement of Direction Page 2
Sun Microsystems, Inc Proprietary and Confidential
Product Priorities
1. Interoperability with third party software components
+ External (non-4GL) client support (e.g., browsers, Java clients)
+ External server integration (e.g., messaging, component support, data
exchange)
2. Enhanced productivity
+ Increased automation (i.e., less coding)
+ Support for platform updates (e.g., new versions of OS, DBMS)
3. TOOL code to Java code migration
4. Unified developer look and feel with other Forte development products
5. Common repository
Short Term Product Plans
Mid-year release
+ New features available as ?preview? per the standard Forte maintenance
release procedures
+ Tentatively labeled ?release 3.5? and distributed as a free product
enhancement for
customers under maintenance
+ Scheduled for Summer 2000
+ Defining features
+ Introspection (reflection) ? the ability for an object to describe itself at
runtime
+ Improved integration with applications developed using Forté-for-Java
Community
Edition
+ Platform support improvements to track important operating system and
database
vendor activity
+ Target features
+ Display system enhancements (e.g., Motif 2 support, line arrowheads, window
refresh control, editable outline fields)
+ Dynamic library loading
+ Improved CORBA/IIOP support
+ Improved XML and XSLT class support
+ JMQ support
New year release
+ New features available as ?preview? per the standard Forte maintenance
release procedures
+ Tentatively labeled ?release 3.6? and distributed as a free product
enhancement for
customers under maintenance
+ Scheduled for year end 2000
+ Defining features
+ Any Release 3.5 target features that were not included in 3.5
+ Generation of EJB interfaces for R3 service objects
+ Platform support improvements to track important operating system and
database
vendor activity
+ Target features
+ COBOL record handling as part of the OS390 transaction adaptor
+ Improved runtime security
+ Interface classes for access to Netscape Server 4.0 and possibly other web
servers
Long Term Product Plans
+ To be determined by customer and market feedback.
+ A major criterion for new functionality will be enhancing the revenue
generating ability of
the product, thereby fostering its long-term health in the marketplace.
+ Substantial emphasis will be placed on creating new capabilities that enhance
the
attractiveness of the product for new users.
+ The contents of Release 3.7 (or whatever it will be called) will be
solidified just after release
3.5 ships. Subsequent planning visibility will be two forward releases.
"Klerk, Theo de" <Theo.de.Klerkcompaq.com> on 04/18/2000 12:27:36 PM
To: "'Rottier, Pascal'" <Rottier.Pascalpmintl.ch>,
"'kamranaminyahoo.com'" <kamranaminyahoo.com>
cc: (bcc: Charlie Shell/Bsg/MetLife/US)
Subject: RE: (forte-users) Forte ADE -
RE: forte-users-digest V1 #322
Re: "We wish to eliminate any object references to the service object's
partition. Any insight would be greatly appreciated." from Van Vuong
<[email protected]>
This was in regards to copying a set of object from a server to client.
An implicit clone is being done. This also copyies objects they want to
remain on the server.
I believe the normal method of doing this is to anchor the server side
objects. Then when the deep clone occurs, it stops at the anchored
objects generating a proxy. That can also have other affects you do not
want but will at least stop the copying.
From: owner-forte-users-digest
Sent: Tuesday, April 15, 1997 8:09 AM
To: forte-users-digest
Subject: forte-users-digest V1 #322
forte-users-digest Tuesday, 15 April 1997 Volume 01 :
Number 322
How does deep copy apply to arrays?
Re: Global Variables
Re: Global Variables
Using the Edit commands in a menu
Re: Global Variables
Re: How does deep copy apply to arrays?
From: Van Vuong <[email protected]>
Date: Mon, 14 Apr 1997 17:16:46 -0500
Subject: How does deep copy apply to arrays?
I have a service object that has a method that returns an array of
objects. The return type for the method is defined with the copy option.
I found documentation that states that the copy option creates a deep
copy of the return variable on the partition that called the method.
My question is: If the return type for the method is an array of
objects, will the copy option create copies of all objects/elements in
the array?
We wish to eliminate any object references to the service object's
partition. Any insight would be greatly appreciated.
Thanks in advance,
Van Vuong
Phone: 972.985.5289
Pager: 972.320.2232
VoiceNow Pager: 972.330.0822
E-mail: [email protected]
PAGE NET
From: David Bell <[email protected]>
Date: Mon, 14 Apr 1997 22:44:19 +0000
Subject: Re: Global Variables
I got so much mail about and the object location manager, so
I'll continue ...
To make the thing truly portable, regardless of partition,
you need to register the object with a name that is made
up on the fly.
The easisest way to do this is to make up a name composed of
nodename (hopefully unique) plus the process ID. This should
guarantee that you get to the correct object even if there are
several instances around.
Get the nodename from the operating system, then use the partition
agent to ask for the PID. Form a unique name by concatenating these
two piecies of information.
// set up this app's subdirectory namespace
ObjName : TextData = new(Value = '/MyApp/');
// add nodename
ObjName.Concat(task.part.operatingsystem.nodename);
// get PID
Partition : ActivePartitionAgent
= ActivePartitionAgent(task.part.ActPartAgent);
Instrument : ConfigValueInst
= ConfigValueInst(Partition.FindInstrument('ProcessID'));
// add PID to name
Objname.Concat(Instrument.GetData.TextValue);
Now register an anchored object with the object location
manager
// get the object location manager
olm : ObjectLocationMgr;
olm = task.Part.ObjectLocationMgr;
// register my object with the name
olm.RegisterObject(name = Objname, object = MyObj);
Once it's registered, ask the object location manager for a handle
so we can use it. Build the name, get hold of the object
location manager, as above, then invoke BindObject on it.
theObj =
(ClassOfMyObj)(olm.BindObject(name=Objname, classType=ClassOfMyObj));
If the names are formed in the same way, this call should return
a handle to the object of message duration - you can set up
session or transaction duration if required in the RegisterObject
call.
In some versions of Forte, before V.2.F.0, this call not work for
objects located in the same partition.
To get at the instruments, you will need to include the SystemMonitor
Library.
To come back to some other points, as Tom Wynant points out, you can
have a user visible service object in a server partition.
The problem comes when what you really want is the same user visible
service object in lots of different partitions so that you can offer
the same service - but locally.
Today there is no way to do this oustide of client partitions without
resorting to something similar to that presented above.
- David
David Bell Tel : +44 1344 482100
Voice mail : +44 1344 353716
Forte Software Limited Mobile : +44 378 300613
Apex House
London Road Email : mailto: [email protected]
Bracknell Web : http://www.forte.com
Berkshire
RG12 2XH
UK
From: Pierre Gelli <[email protected]>
Date: Tue, 15 Apr 1997 09:09:39 +0200
Subject: Re: Global Variables
Hello folks,
Here is my idea on the topic.
Although one normally doesn't need global variables in a OO system, there
are cases when it's useful : a read cache of data available in the local
active partition. This saves the overhead of accessing the data on a
remote=
SO.
I read the solutions described by David Bell (location manager) and David
Krieger (hack of the partition.appTitle).
There is another way I think is a bit cleaner.
It takes benefit of the fact that a custom system agent can be attached
an
object (in our case the local cache containing the global variables).
Any active partition of the application then contains one such custom
agent.
Any class needing a global variable instantiates a small object, which is
a
manager of the custom agent. Its purpose is to ask the active partition
for
the custom agent, and then for the cache. If the agent doesn't exist it
creates it as well has the local cache; if the agent exists, it returns
the
cache.
There is a cache class.
It is derived into one class to be the "cache server" broadcasting an
event
when some cache data changes. This class is used to create a cache
server=
SO.
The cache class is also derived into a "local cache" class. It knows how
to
initialize it from the cache server. It listens to the event for updating
its local data from the cache server SO when needed.
Enough for the machinery.
Then, for any instance of a class that needs a global variable,
only two lines of code are needed, at initialization time, to get a
reference to the local cache of the partition, then a global variable
isaccessed as if part of a local object. This is quite affordable.
This design guaranties that there is automatically one and only one
up-to-date cache object in any active partition (running on a client or
on a
server). The local cache is seen as a local object by all objects that
use
it (no SO there). This design makes no assumption on the partitioning
that
will take place later. Which is I think one key strength of Fort=E9.
If one is interested I can ship some code that illustrates these ideas.
Hope this helps.
Pierre Gelli
ADP GSI
Payroll and Human Resources Management
72-78, Grande Rue, F-92310 SEVRES
phone : +33 1 41 14 86 42 (direct) +33 1 41 14 85 00 (reception desk)
fax : +33 1 41 14 85 99
From: Bryan Gentile <[email protected]>
Date: Tue, 15 Apr 1997 09:01:35 -0400
Subject: Using the Edit commands in a menu
I was wondering if anyone knows how to code for the edit menu submenu
items
like cut, copy, and paste. I am trying to use these in my menu, but I
cannot find anything about how to code for them. Is there anything in
the
help or any examples to look at. I have been unsuccessful in finding
anything about this.
Thanks
From: [email protected]
Date: Tue, 15 Apr 1997 9:08:01 -0400 (EDT)
Subject: Re: Global Variables
[email protected] writes:
<Snip!>
Unfortunately all Forte Service Objects share a single name
space. I thought from the documentation that User Visible
Service Objects would work for me. However, when I tried User
Visible Service Objects, they didn't quite do the trick because
what I wanted was identically named service objects that resolve
to a different local instance for each partition.You're right. You can put the user-visible service object in any
partition you like, but it must go in one and only one
partition. Rats. I can see why it's this way (based on the
minimal implementation of the name server), but I can think of
some good reasons why it shouldn't be. In fact, I may need to
move some methods around based on this discussion. Again, rats!
Tom Wyant
"The greatest danger of communication is the illusion that it has
occurred." (wish I knew who said that!).
From: [email protected]
Date: Tue, 15 Apr 1997 09:54:10 -0500
Subject: Re: How does deep copy apply to arrays?
Copy option always copies deep. Remember, also if you pass the array
accross partitions, whether you specify copy or not, it is going to copy
and copy deep.
In an array, I am not sure if have the problem, because unless the array
in-turn holds a huge tree, the array object may be wide, but not deep.
Some thing to think about??
Venkat
End of forte-users-digest V1 #322
*********************************Re: "We wish to eliminate any object references to the service object's
partition. Any insight would be greatly appreciated." from Van Vuong
<[email protected]>
This was in regards to copying a set of object from a server to client.
An implicit clone is being done. This also copyies objects they want to
remain on the server.
I believe the normal method of doing this is to anchor the server side
objects. Then when the deep clone occurs, it stops at the anchored
objects generating a proxy. That can also have other affects you do not
want but will at least stop the copying.
From: owner-forte-users-digest
Sent: Tuesday, April 15, 1997 8:09 AM
To: forte-users-digest
Subject: forte-users-digest V1 #322
forte-users-digest Tuesday, 15 April 1997 Volume 01 :
Number 322
How does deep copy apply to arrays?
Re: Global Variables
Re: Global Variables
Using the Edit commands in a menu
Re: Global Variables
Re: How does deep copy apply to arrays?
From: Van Vuong <[email protected]>
Date: Mon, 14 Apr 1997 17:16:46 -0500
Subject: How does deep copy apply to arrays?
I have a service object that has a method that returns an array of
objects. The return type for the method is defined with the copy option.
I found documentation that states that the copy option creates a deep
copy of the return variable on the partition that called the method.
My question is: If the return type for the method is an array of
objects, will the copy option create copies of all objects/elements in
the array?
We wish to eliminate any object references to the service object's
partition. Any insight would be greatly appreciated.
Thanks in advance,
Van Vuong
Phone: 972.985.5289
Pager: 972.320.2232
VoiceNow Pager: 972.330.0822
E-mail: [email protected]
PAGE NET
From: David Bell <[email protected]>
Date: Mon, 14 Apr 1997 22:44:19 +0000
Subject: Re: Global Variables
I got so much mail about and the object location manager, so
I'll continue ...
To make the thing truly portable, regardless of partition,
you need to register the object with a name that is made
up on the fly.
The easisest way to do this is to make up a name composed of
nodename (hopefully unique) plus the process ID. This should
guarantee that you get to the correct object even if there are
several instances around.
Get the nodename from the operating system, then use the partition
agent to ask for the PID. Form a unique name by concatenating these
two piecies of information.
// set up this app's subdirectory namespace
ObjName : TextData = new(Value = '/MyApp/');
// add nodename
ObjName.Concat(task.part.operatingsystem.nodename);
// get PID
Partition : ActivePartitionAgent
= ActivePartitionAgent(task.part.ActPartAgent);
Instrument : ConfigValueInst
= ConfigValueInst(Partition.FindInstrument('ProcessID'));
// add PID to name
Objname.Concat(Instrument.GetData.TextValue);
Now register an anchored object with the object location
manager
// get the object location manager
olm : ObjectLocationMgr;
olm = task.Part.ObjectLocationMgr;
// register my object with the name
olm.RegisterObject(name = Objname, object = MyObj);
Once it's registered, ask the object location manager for a handle
so we can use it. Build the name, get hold of the object
location manager, as above, then invoke BindObject on it.
theObj =
(ClassOfMyObj)(olm.BindObject(name=Objname, classType=ClassOfMyObj));
If the names are formed in the same way, this call should return
a handle to the object of message duration - you can set up
session or transaction duration if required in the RegisterObject
call.
In some versions of Forte, before V.2.F.0, this call not work for
objects located in the same partition.
To get at the instruments, you will need to include the SystemMonitor
Library.
To come back to some other points, as Tom Wynant points out, you can
have a user visible service object in a server partition.
The problem comes when what you really want is the same user visible
service object in lots of different partitions so that you can offer
the same service - but locally.
Today there is no way to do this oustide of client partitions without
resorting to something similar to that presented above.
- David
David Bell Tel : +44 1344 482100
Voice mail : +44 1344 353716
Forte Software Limited Mobile : +44 378 300613
Apex House
London Road Email : mailto: [email protected]
Bracknell Web : http://www.forte.com
Berkshire
RG12 2XH
UK
From: Pierre Gelli <[email protected]>
Date: Tue, 15 Apr 1997 09:09:39 +0200
Subject: Re: Global Variables
Hello folks,
Here is my idea on the topic.
Although one normally doesn't need global variables in a OO system, there
are cases when it's useful : a read cache of data available in the local
active partition. This saves the overhead of accessing the data on a
remote=
SO.
I read the solutions described by David Bell (location manager) and David
Krieger (hack of the partition.appTitle).
There is another way I think is a bit cleaner.
It takes benefit of the fact that a custom system agent can be attached
an
object (in our case the local cache containing the global variables).
Any active partition of the application then contains one such custom
agent.
Any class needing a global variable instantiates a small object, which is
a
manager of the custom agent. Its purpose is to ask the active partition
for
the custom agent, and then for the cache. If the agent doesn't exist it
creates it as well has the local cache; if the agent exists, it returns
the
cache.
There is a cache class.
It is derived into one class to be the "cache server" broadcasting an
event
when some cache data changes. This class is used to create a cache
server=
SO.
The cache class is also derived into a "local cache" class. It knows how
to
initialize it from the cache server. It listens to the event for updating
its local data from the cache server SO when needed.
Enough for the machinery.
Then, for any instance of a class that needs a global variable,
only two lines of code are needed, at initialization time, to get a
reference to the local cache of the partition, then a global variable
isaccessed as if part of a local object. This is quite affordable.
This design guaranties that there is automatically one and only one
up-to-date cache object in any active partition (running on a client or
on a
server). The local cache is seen as a local object by all objects that
use
it (no SO there). This design makes no assumption on the partitioning
that
will take place later. Which is I think one key strength of Fort=E9.
If one is interested I can ship some code that illustrates these ideas.
Hope this helps.
Pierre Gelli
ADP GSI
Payroll and Human Resources Management
72-78, Grande Rue, F-92310 SEVRES
phone : +33 1 41 14 86 42 (direct) +33 1 41 14 85 00 (reception desk)
fax : +33 1 41 14 85 99
From: Bryan Gentile <[email protected]>
Date: Tue, 15 Apr 1997 09:01:35 -0400
Subject: Using the Edit commands in a menu
I was wondering if anyone knows how to code for the edit menu submenu
items
like cut, copy, and paste. I am trying to use these in my menu, but I
cannot find anything about how to code for them. Is there anything in
the
help or any examples to look at. I have been unsuccessful in finding
anything about this.
Thanks
From: [email protected]
Date: Tue, 15 Apr 1997 9:08:01 -0400 (EDT)
Subject: Re: Global Variables
[email protected] writes:
<Snip!>
Unfortunately all Forte Service Objects share a single name
space. I thought from the documentation that User Visible
Service Objects would work for me. However, when I tried User
Visible Service Objects, they didn't quite do the trick because
what I wanted was identically named service objects that resolve
to a different local instance for each partition.You're right. You can put the user-visible service object in any
partition you like, but it must go in one and only one
partition. Rats. I can see why it's this way (based on the
minimal implementation of the name server), but I can think of
some good reasons why it shouldn't be. In fact, I may need to
move some methods around based on this discussion. Again, rats!
Tom Wyant
"The greatest danger of communication is the illusion that it has
occurred." (wish I knew who said that!).
From: [email protected]
Date: Tue, 15 Apr 1997 09:54:10 -0500
Subject: Re: How does deep copy apply to arrays?
Copy option always copies deep. Remember, also if you pass the array
accross partitions, whether you specify copy or not, it is going to copy
and copy deep.
In an array, I am not sure if have the problem, because unless the array
in-turn holds a huge tree, the array object may be wide, but not deep.
Some thing to think about??
Venkat
End of forte-users-digest V1 #322
********************************* -
RE: (forte-users) Hotkeys
when self.window.FunctionKeyPress(p_intKey=keyID, p_intMod=modifier) do
if p_intKey = FN_F9 and p_intMod =KM_SHIFT then
-- Do something
end if;
if p_intKey = FN_F8 and p_intMod =KM_SHIFT then
-- Do something
end if;
ka
-----Original Message-----
From: Babu Raj [mailto:ibcsmartboyyahoo.com]
Sent: Friday, July 07, 2000 2:01 PM
To: kamranaminyahoo.com
Subject: (forte-users) Hotkeys
Hi,
Is there anyone used hot keys, with window
buttons.Hot keys work with menu but not with buttons,
is there something i need to specially set? any help
is appreciated
Thanks,
Babu
Send instant messages & get email alerts with Yahoo! Messenger.
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.comBabu,
Hotkeys for buttons only work for versions 3.0.M and above. Also, there are
some problems I found when testing them. When you press the hot key it posts
the click event for the button which has registered a Hot Key. The problem
is that it posts the click event even if the button is
disabled/invisible/inactive or even on a different tab folder page. Also, if
you have two tab folder pages with the same set of buttons (eg &Insert,
&Edit, &Delete) but for different purposes, Forte only registers the first
unique Button Hot Key (eg I for &Insert) and ignores the others even if they
are on different pages. This can cause confusion because the User thinks
they are trying to insert on one tab folder page but it triggers the insert
on the first tab folder page.
My recommendation is be careful using Hot-Keys by adding extra code in the
event registration for the Click of Hot Key buttons to make sure that the
button was able to be clicked and try not use Hot Keys on Tab Pages.
Hope this helps,
Allister Dickson
Xpedior
www.xpedior.com
Ph: +61-8-9485-0399
Mob: +61-402-052-943
Fax: +61-8-9486-8650
-----Original Message-----
From: Babu Raj [mailto:ibcsmartboyyahoo.com]
Sent: Saturday, 8 July 2000 4:01
To: kamranaminyahoo.com
Subject: (forte-users) Hotkeys
Hi,
Is there anyone used hot keys, with window
buttons.Hot keys work with menu but not with buttons,
is there something i need to specially set? any help
is appreciated
Thanks,
Babu
Send instant messages & get email alerts with Yahoo! Messenger.
For the archives, go to: http://lists.xpedior.com/forte-users and use
the login: forte and the password: archive. To unsubscribe, send in a
new
email the word: 'Unsubscribe' to: forte-users-requestlists.xpedior.com -
Floating boxes applet with drag events need click event
I Have an applet cobbled from the net & modified. Is works but needs one major event added. It draws "Graphics.drawline" boxes with a text "String" inside each box ( the text string represents an URL location). These "boxes" are objects which are "draggable to other locations on canvas & therefore can be independently positioned by user. Each box redraws itself periodically to a slightly different screen location & becomes stationary after a 5 or 6 seconds. The point is, all of this "drag & mobility" behavior must remain intact & is not part of the "problem task".
Task: Need to have an "event" behavior added in one of two ways ( or a 3rd way if there is another ) whichever is quickest/ easiest. "Clickable mouse events" must be added to each box. ( boxes are built in a loop so adding to one will add to other locations & create as many "buttons" as there are boxes) . At each box's location, clicking one box should be an event which fires & clicking a different box should be a separate event which fires. Separate , so that URL location can be "hotlinked" to each box. That URL is currently displayed in the boxes (visible when running applet).
1st possible solution: Exchange these "boxes" which appear on canvas into clickable event "Graph panel.buttons" ( for example or some other clickable object) which maintains existing "drag" behavior of boxes. These buttons must each have "clickability" with mouse events to enable placing "getAppletContext. showDocument()" code with these events ( e.g., "hotlinked" to http locations).
or
2nd possible solution:. The drawstring boxes are currently dead string text with no event model other than the "drag" feature associated with each box. Must add an additional mouse event behavior to existing boxes so they are "clickable" ( or text inside is clickable) and can then execute "showDocument()" URL when clicked independently.
Maybe there is a #3. I don't know what that would be. Open to try anything without losing the drag & placement mobility of existing boxes.
These "boxes" could be images, or event buttons - doesnt matter.
Not sure if #2 is possible & have not been able to accomplish #1. Must stay within existing AWT framework so IE browsers can run it natively ( which of course IE cannot run Swing graphics unless a Sun plugin loaded ).
Applet is a single file ( creating 4 classes).
html file (which invokes it) passes a string param which is broken into above noted URL strings in each box.
Running this applet, you see a "button" event ( at base of canvas labeled "NewUrl" ) which pops up an url location when clicked ( using "showdocument"). This button is not attached to locations or text of each box object ( which is the "task" to accomplish) . The button does represent the kind of event behavior which each "box" should have when task is achieved. So the box can be exchanged with buttons or the boxes can be imbued with events to hyperlink like a button.
In spirit of solution #1, here is the bonehead attempt I tried which did not work: copied entire "if" block of logic from the button event (sited in preceding paragraph) into region of code which builds boxes ( "for" loop of "drawstring" method).
"g.drawString(doit, x - (w-10)/2, (y - (h-4)/2) + fm.getAscent());"
I copied all the "if" block of logic for button creation into the area immediately after the above line ( for loop which builds the boxes). Hoping that I could create buttons with events, along with all the boxes (which are getting created using "drawstring" above in a "for" loop). These "buttons" must also have positioning info of each box to appear in different locations on the canvas. Positioning data is not in that "if" block of code but it would have been a start to get the multiple buttons created ( even if all drawn in one spot). The "if" code block I've provieded for an example begins with the line:
" if ("NewUrl".equals(arg)) { "
and ends with with lines:
" return true; "
" } " //< -- end of above if block
This full "if" block can be seen in the listing below:
This "if" block creates the "NewUrl" button. Of course, I got a bunch of errors when I tried to copy this block to the above location:
variable: "arg" "not found in class GraphPanel".
methods: "getcodebase, showstatus, getappletcontext()"
"not found in class GraphPanel".
----------- The applet code in total follows next
Here are both the java & htm complete source.
import java.net.MalformedURLException;
import java.net.URL;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.applet.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.*;
class Node {
double x;
double y;
double dx;
double dy;
boolean fixed;
String lbl;
class Edge {
int from;
int to;
double len;
} // eEdgeCla
class GraphPanel extends Panel implements Runnable {
Box box;
int nnodes;
Node nodes[] = new Node[100];
int nedges;
Edge edges[] = new Edge[200];
Thread relaxer;
boolean showit;
boolean random;
GraphPanel(Box box) {
this.box = box;
} //ebox
int findNode(String lbl) {
for (int i = 0 ; i < nnodes ; i++) {
if (nodes.lbl.equals(lbl)) {
return i;
return addNode(lbl);
int addNode(String lbl) {
Node n = new Node();
n.x = 10 + 380*Math.random();
n.y = 10 + 380*Math.random();
n.lbl = lbl;
nodes[nnodes] = n;
return nnodes++;
void addEdge(String from, String to, int len) {
Edge e = new Edge();
e.from = findNode(from);
e.to = findNode(to);
e.len = len;
edges[nedges++] = e;
public void run() {
int i3=0;
while (true) {
relax();
if (random && (Math.random() < 0.03)) {
Node n = nodes[(int) (1 * nnodes) ]; // no
if (!n.fixed) {
n.x += (100*0.02) - 50;
n.y += (100*0.02) - 50; //
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
break;
i3++;
} //ew
} // epublrun()
synchronized void relax() {
for (int i = 0 ; i < nedges ; i++) {
Edge e = edges;
double vx = nodes[e.to].x - nodes[e.from].x;
double vy = nodes[e.to].y - nodes[e.from].y;
double len = Math.sqrt(vx * vx + vy * vy);
double f = (edges.len - len) / (len * 3) ;
double dx = f * vx;
double dy = f * vy;
nodes[e.to].dx += dx;
nodes[e.to].dy += dy;
nodes[e.from].dx += -dx;
nodes[e.from].dy += -dy;
} //efo
for (int i = 0 ; i < nnodes ; i++) {
Node n1 = nodes;
double dx = 0;
double dy = 0;
for (int j = 0 ; j < nnodes ; j++) {
if (i == j) {
continue;
Node n2 = nodes[j];
double vx = n1.x - n2.x;
double vy = n1.y - n2.y;
double len = vx * vx + vy * vy;
if (len == 0) {
dx += 0.02;
dy += 0.02;
} else if (len < 100*100) {
dx += vx / len;
dy += vy / len;
} //ef3a
double dlen = dx * dx + dy * dy;
if (dlen > 0) {
dlen = Math.sqrt(dlen) / 2;
n1.dx += dx / dlen;
n1.dy += dy / dlen;
} //ef3
Dimension d = size();
// f4
for (int i = 0 ; i < nnodes ; i++) {
Node n = nodes;
if (!n.fixed) {
n.x += Math.max(-5, Math.min(5, n.dx));
n.y += Math.max(-5, Math.min(5, n.dy));
if (n.x < 0) {
n.x = 0;
} else if (n.x > d.width) {
n.x = d.width;
if (n.y < 0) {
n.y = 0;
} else if (n.y > d.height) {
n.y = d.height;
n.dx /= 2;
n.dy /= 2;
repaint();
Node pick;
boolean pickfixed;
Image offscreen;
Dimension offscreensize;
Graphics offgraphics;
final Color fixedColor = Color.green;
final Color selectColor = Color.gray;
final Color edgeColor = Color.black;
final Color nodeColor = new Color(200, 90, 50);
final Color showitColor = Color.gray;
final Color arcColor1 = Color.black;
final Color arcColor2 = Color.orange;
final Color arcColor3 = Color.blue;
public void paintNode( Graphics g, Node n, FontMetrics fm) {
int x = (int)n.x;
int y = (int)n.y;
g.setColor((n == pick) ? selectColor : (n.fixed ? fixedColor : nodeColor));
int w = fm.stringWidth(n.lbl) + 10;
int h = fm.getHeight() + 4;
g.fillRect(x - w/2, y - h / 2, w, h);
g.setColor(Color.black);
g.drawRect(x - w/2, y - h / 2, w-1, h-1);
String doit = n.lbl.replace('x','/');
g.drawString(doit, x - (w-10)/2, (y - (h-4)/2) + fm.getAscent());
} // epa
public synchronized void update(Graphics g) {
Dimension d = size();
if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
offgraphics = offscreen.getGraphics();
offgraphics.setFont(getFont());
offgraphics.setColor(getBackground());
offgraphics.fillRect(0, 0, d.width, d.height);
for (int i = 0 ; i < nedges ; i++) {
Edge e = edges;
int x1 = (int)nodes[e.from].x;
int y1 = (int)nodes[e.from].y;
int x2 = (int)nodes[e.to].x;
int y2 = (int)nodes[e.to].y;
int len = (int)Math.abs(Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) - e.len);
offgraphics.setColor((len < 10) ? arcColor1 : (len < 20 ? arcColor2 : arcColor3)) ;
offgraphics.drawLine(x1, y1, x2, y2);
if (showit) {
String lbl = String.valueOf(len);
offgraphics.setColor(showitColor);
offgraphics.drawString("href= http://localhost:"+lbl, x1 + (x2-x1)/2, y1 + (y2-y1)/2);
offgraphics.setColor(edgeColor);
} //ef5
FontMetrics fm = offgraphics.getFontMetrics();
for (int i = 0 ; i < nnodes ; i++) {
paintNode( offgraphics, nodes, fm); //or
g.drawImage(offscreen, 0, 0, null);
public synchronized boolean mouseDown(Event evt, int x, int y) {
double bestdist = Double.MAX_VALUE;
for (int i = 0 ; i < nnodes ; i++) {
Node n = nodes;
double dist = (n.x - x) * (n.x - x) + (n.y - y) * (n.y - y);
if (dist < bestdist) {
pick = n;
bestdist = dist;
pickfixed = pick.fixed;
pick.fixed = true;
pick.x = x;
pick.y = y;
repaint();
return true;
public synchronized boolean mouseDrag(Event evt, int x, int y) {
pick.x = x;
pick.y = y;
repaint();
return true;
} //e-pubsyncmousedrag
public synchronized boolean mouseUp(Event evt, int x, int y) {
pick.x = x;
pick.y = y;
pick.fixed = pickfixed;
pick = null;
repaint();
return true;
public void start() {
relaxer = new Thread(this);
relaxer.start();
public void stop() {
relaxer.stop();
public class Box extends Applet {
GraphPanel panel;
public void init() {
setLayout(new BorderLayout());
panel = new GraphPanel(this);
add("Center", panel);
Panel p = new Panel();
add("South", p);
p.add(new Button("Reposition"));
p.add(new Button("NewUrl"));
p.add(new Checkbox("Showit"));
String edges = getParameter("edges"); // putinli
for (StringTokenizer t = new StringTokenizer(edges, ",") ; t.hasMoreTokens() ; ) {
String str = t.nextToken();
int i = str.indexOf('-');
if (i > 0) { int len = 50;
int j = str.indexOf('/');
if (j > 0) {
len = Integer.valueOf(str.substring(j+1)).intValue();
str = str.substring(0, j);
panel.addEdge(str.substring(0,i), str.substring(i+1), len);
} //ef8
Dimension d = size();
String center = getParameter("center");
if (center != null){
Node n = panel.nodes[panel.findNode(center)];
n.x = d.width / 2;
n.y = d.height / 2;
n.fixed = true;
} // eif
} // ep
public void start() {
panel.start();
public void stop() {
panel.stop();
public boolean action(Event evt, Object arg) {
if (arg instanceof Boolean) {
if (((Checkbox)evt.target).getLabel().equals("Showit")) {
panel.showit = ((Boolean)arg).booleanValue();
}// e-
else {
panel.random = ((Boolean)arg).booleanValue();
return true;
} // e-if instof bool
if ("Reposition".equals(arg)) {
Dimension d = size();
for (int i = 0 ; i < panel.nnodes ; i++) {
Node n = panel.nodes;
if (!n.fixed) {
n.x = 10 + (d.width-20)*Math.random();
n.y = 10 + (d.height-20)*Math.random();
} //ei
} //ef9
return true;
} //eif scram
if ("NewUrl".equals(arg)) {
Dimension d = size();
URL url = getCodeBase();
try {
getAppletContext().showDocument( new URL(url+"main.htm"), "_blank" );
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
} catch(MalformedURLException e) {
showStatus("814 URL not found");
for (int i = 0 ; i < panel.nnodes ; i++) {
Node n = panel.nodes;
if (!n.fixed) {
n.x += (80*0.02) - 40;
n.y += (80*0.02) - 40;
return true;
} //ei
return false;
-----------------------htm file to launch------------------------------
<html>
<head>
<title>R
</title>
</head>
<body>
<h3>
<center>
R
</center>
</h3>
I
<b>
</b>
<table border = 1>
<td>De<td>Test List<tr>
<td>N <td><tr>
<td>N <td><tr>
</table>
<b>view </b>
<applet code="Box.class" CODEBASE=. width=1000 height=600
ALT="Test ">
<param name=edges value="http:xxabc.htm-http:xxnet.htm,http:xxthis.htm-http:xx.comet.htm,http:xxnewsighting.htm-http:xxstar.htm,http:xxmoon.htm-http:xxNeptune.htm">
<hr>
</applet>
</b>
<p>
<table border = 1>
<tr>
<tr>
</table>
</html>
</body>
instructions to compile :
0 : The discussion becomes easy to follow after 1st compiling
& viewing the applet.
1. : cut out applet code.
2. : the post somehow deleted all references to "" <--- HERE
see, the data has been deleted again as I preview this post.
( that "" should contain an "i" array increment argument:
"open square bracket" "i" "close square bracket" ) array
so "javac Box.java" will get 10 errors. These "[" "i" "]"
array args must be replaced to compile the code.
3. : All array variables inside the 10 "for" loops ( the bare words
"edges" and "nodes" ) without array increment "i" should
read "edges" "[" "i" "]" & "nodes" "[" "i" "]".
The 10 location lines are approx:
line #65, #129, #136, #149, #195, #283, #311, #331, #477, #522
4. : These 10 edits reqresent a missing "i" to all 10 for loop arrays.
for eddges & nodes. fix this & javac Box.java" will get
4 class files.
5. : cut "Box.htm" from post & do "appletviewer Box.htm"
or put in an apache "htdoc" or tomcat "servlet" http delivered
directory & call "http://localhost/Box.htm.
6. : of course, selecting the event button "NewUrl" will not
work in appletviewer but will work in an http web location.
7. : post your questions to problem or fixes to problem as I'm
monitoring closely. TIA.Thanks for code post tip to fix array deletion problem.
Here is code reposted using delimiters with will
compile straight out of cut/paste.import java.net.MalformedURLException;
import java.net.URL;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.applet.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.*;
class Node {
double x;
double y;
double dx;
double dy;
boolean fixed;
String lbl;
class Edge {
int from;
int to;
double len;
} // eEdgeCla
class GraphPanel extends Panel implements Runnable {
Box box;
int nnodes;
Node nodes[] = new Node[100];
int nedges;
Edge edges[] = new Edge[200];
Thread relaxer;
boolean showit;
boolean random;
GraphPanel(Box box) {
this.box = box;
} //ebox
int findNode(String lbl) {
for (int i = 0 ; i < nnodes ; i++) {
//if (nodes.lbl.equals(lbl)) {
if (nodes.lbl.equals(lbl)) {
return i;
return addNode(lbl);
int addNode(String lbl) {
Node n = new Node();
n.x = 10 + 380*Math.random();
n.y = 10 + 380*Math.random();
n.lbl = lbl;
nodes[nnodes] = n;
return nnodes++;
void addEdge(String from, String to, int len) {
Edge e = new Edge();
e.from = findNode(from);
e.to = findNode(to);
e.len = len;
edges[nedges++] = e;
public void run() {
int i3=0;
while (true) {
relax();
if (random && (Math.random() < 0.03)) {
Node n = nodes[(int) (1 * nnodes) ]; // no
if (!n.fixed) {
n.x += (100*0.02) - 50;
n.y += (100*0.02) - 50; //
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
break;
i3++;
} //ew
} // epublrun()
synchronized void relax() {
for (int i = 0 ; i < nedges ; i++) {
//Edge e = edges;
Edge e = edges[i];
double vx = nodes[e.to].x - nodes[e.from].x;
double vy = nodes[e.to].y - nodes[e.from].y;
double len = Math.sqrt(vx * vx + vy * vy);
//double f = (edges.len - len) / (len * 3) ;
double f = (edges[i].len - len) / (len * 3) ;
double dx = f * vx;
double dy = f * vy;
nodes[e.to].dx += dx;
nodes[e.to].dy += dy;
nodes[e.from].dx += -dx;
nodes[e.from].dy += -dy;
} //efo
for (int i = 0 ; i < nnodes ; i++) {
//Node n1 = nodes[i];
Node n1 = nodes[i];
double dx = 0;
double dy = 0;
for (int j = 0 ; j < nnodes ; j++) {
if (i == j) {
continue;
Node n2 = nodes[j];
double vx = n1.x - n2.x;
double vy = n1.y - n2.y;
double len = vx * vx + vy * vy;
if (len == 0) {
dx += 0.02;
dy += 0.02;
} else if (len < 100*100) {
dx += vx / len;
dy += vy / len;
} //ef3a
double dlen = dx * dx + dy * dy;
if (dlen > 0) {
dlen = Math.sqrt(dlen) / 2;
n1.dx += dx / dlen;
n1.dy += dy / dlen;
} //ef3
Dimension d = size();
// f4
for (int i = 0 ; i < nnodes ; i++) {
//Node n = nodes;
Node n = nodes[i];
if (!n.fixed) {
n.x += Math.max(-5, Math.min(5, n.dx));
n.y += Math.max(-5, Math.min(5, n.dy));
if (n.x < 0) {
n.x = 0;
} else if (n.x > d.width) {
n.x = d.width;
if (n.y < 0) {
n.y = 0;
} else if (n.y > d.height) {
n.y = d.height;
n.dx /= 2;
n.dy /= 2;
repaint();
Node pick;
boolean pickfixed;
Image offscreen;
Dimension offscreensize;
Graphics offgraphics;
final Color fixedColor = Color.green;
final Color selectColor = Color.gray;
final Color edgeColor = Color.black;
final Color nodeColor = new Color(200, 90, 50);
final Color showitColor = Color.gray;
final Color arcColor1 = Color.black;
final Color arcColor2 = Color.orange;
final Color arcColor3 = Color.blue;
public void paintNode( Graphics g, Node n, FontMetrics fm) {
int x = (int)n.x;
int y = (int)n.y;
g.setColor((n == pick) ? selectColor : (n.fixed ? fixedColor : nodeColor));
int w = fm.stringWidth(n.lbl) + 10;
int h = fm.getHeight() + 4;
g.fillRect(x - w/2, y - h / 2, w, h);
g.setColor(Color.black);
g.drawRect(x - w/2, y - h / 2, w-1, h-1);
String doit = n.lbl.replace('x','/');
g.drawString(doit, x - (w-10)/2, (y - (h-4)/2) + fm.getAscent());
} // epa
public synchronized void update(Graphics g) {
Dimension d = size();
if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
offgraphics = offscreen.getGraphics();
offgraphics.setFont(getFont());
offgraphics.setColor(getBackground());
offgraphics.fillRect(0, 0, d.width, d.height);
for (int i = 0 ; i < nedges ; i++) {
//Edge e = edges;
Edge e = edges[i];
int x1 = (int)nodes[e.from].x;
int y1 = (int)nodes[e.from].y;
int x2 = (int)nodes[e.to].x;
int y2 = (int)nodes[e.to].y;
int len = (int)Math.abs(Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) - e.len);
offgraphics.setColor((len < 10) ? arcColor1 : (len < 20 ? arcColor2 : arcColor3)) ;
offgraphics.drawLine(x1, y1, x2, y2);
if (showit) {
String lbl = String.valueOf(len);
offgraphics.setColor(showitColor);
offgraphics.drawString("href= http://localhost:"+lbl, x1 + (x2-x1)/2, y1 + (y2-y1)/2);
offgraphics.setColor(edgeColor);
} //ef5
FontMetrics fm = offgraphics.getFontMetrics();
for (int i = 0 ; i < nnodes ; i++) {
//paintNode( offgraphics, nodes, fm); //or
paintNode( offgraphics, nodes[i], fm); //or
g.drawImage(offscreen, 0, 0, null);
public synchronized boolean mouseDown(Event evt, int x, int y) {
double bestdist = Double.MAX_VALUE;
for (int i = 0 ; i < nnodes ; i++) {
//Node n = nodes;
Node n = nodes[i];
double dist = (n.x - x) * (n.x - x) + (n.y - y) * (n.y - y);
if (dist < bestdist) {
pick = n;
bestdist = dist;
pickfixed = pick.fixed;
pick.fixed = true;
pick.x = x;
pick.y = y;
repaint();
return true;
public synchronized boolean mouseDrag(Event evt, int x, int y) {
pick.x = x;
pick.y = y;
repaint();
return true;
} //e-pubsyncmousedrag
public synchronized boolean mouseUp(Event evt, int x, int y) {
pick.x = x;
pick.y = y;
pick.fixed = pickfixed;
pick = null;
repaint();
return true;
public void start() {
relaxer = new Thread(this);
relaxer.start();
public void stop() {
relaxer.stop();
public class Box extends Applet {
GraphPanel panel;
public void init() {
setLayout(new BorderLayout());
panel = new GraphPanel(this);
add("Center", panel);
Panel p = new Panel();
add("South", p);
p.add(new Button("Reposition"));
p.add(new Button("NewUrl"));
p.add(new Checkbox("Showit"));
String edges = getParameter("edges"); // putinli
for (StringTokenizer t = new StringTokenizer(edges, ",") ; t.hasMoreTokens() ; ) {
String str = t.nextToken();
int i = str.indexOf('-');
if (i > 0) { int len = 50;
int j = str.indexOf('/');
if (j > 0) {
len = Integer.valueOf(str.substring(j+1)).intValue();
str = str.substring(0, j);
panel.addEdge(str.substring(0,i), str.substring(i+1), len);
} //ef8
Dimension d = size();
String center = getParameter("center");
if (center != null){
Node n = panel.nodes[panel.findNode(center)];
n.x = d.width / 2;
n.y = d.height / 2;
n.fixed = true;
} // eif
} // ep
public void start() {
panel.start();
public void stop() {
panel.stop();
public boolean action(Event evt, Object arg) {
if (arg instanceof Boolean) {
if (((Checkbox)evt.target).getLabel().equals("Showit")) {
panel.showit = ((Boolean)arg).booleanValue();
}// e-
else {
panel.random = ((Boolean)arg).booleanValue();
return true;
} // e-if instof bool
if ("Reposition".equals(arg)) {
Dimension d = size();
for (int i = 0 ; i < panel.nnodes ; i++) {
//Node n = panel.nodes;
Node n = panel.nodes[i];
if (!n.fixed) {
n.x = 10 + (d.width-20)*Math.random();
n.y = 10 + (d.height-20)*Math.random();
} //ei
} //ef9
return true;
} //eif scram
if ("NewUrl".equals(arg)) {
Dimension d = size();
URL url = getCodeBase();
try {
getAppletContext().showDocument( new URL(url+"main.htm"), "_blank" );
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
} catch(MalformedURLException e) {
showStatus("814 URL not found");
for (int i = 0 ; i < panel.nnodes ; i++) {
//Node n = panel.nodes;
Node n = panel.nodes[i];
if (!n.fixed) {
n.x += (80*0.02) - 40;
n.y += (80*0.02) - 40;
return true;
} //ei
return false;
Maybe you are looking for
-
Java installer in Windows Vista: error 1721
Hi, I cant install java SE in Windows Vista. I get always this error: error 1721. There is a probleme with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package ven
-
how and when we create secondary indexes and what are the advantages and disadvantages of secondary indexes?
-
Adobe Creative Suite Cloud on a MacBook Pro
I need to upgrade my ancient Adobe Creative Suite 3 and just learned that Adobe is now offering just one upgrade option - Creative Suite Cloud. I don't have much choice but upgrade, but before I take the plunge, I'd like to find out what I'm getting
-
My apps won't open and safari won't load any pages???
I cannot open any apps, connect to App store, iTunes store, or open any pages on safari. I have 2 iPads. The one with the problem is the original iPad. My iPad2 works fine. I have turned it off, reset it, restored it, and upgraded it. Nothing seems
-
Hi, I have been using Mac OS X Lion for some time now, and I have noticed that when I use Safari in full screen mode and quit, the next time I launch Safari, it does not launch in full screen again. I have read about apps launching in full screen mod