Synchronizing Data
Problem: When two different web applications are running and one person inserts a record, the other person doesn't see the record unless they reload the application. How do I permit one user to enter information and on the next action of the second user to see the information.
Basically I have a "users" table. If we are both editing this table or viewing it, we should be able to see any and all changes that have been made.
Thanks in advance for your help.
Joe
One possibility.....
Create a timer to re-execute the query on the RowSetInfo object at a given time interval. This will retrieve any changes that the other person has made.
(I would setup the timer to only re-execute the query if the current session/rowset is NOT dirty (i.e. no changes pending))
If a user tries to modify a record that was changed by another user, the built in error trapping will pick this up. I am not sure if this automatically queries on not. If not, you can try to trap this error and re-execute the query programatically. (I am not sure how to do thi, but there have been previous posts on customizing/trapping JBO errors)
Hope this helps
Similar Messages
-
Synchronous data exchange over JCaps without TCP/IP or WebService...
Hi all,
the subject may sound like a little crazy request, but that is what we actually need.
Just to explain: we have a SAP R/3 system running (v. 4.72) which is not able to call Web Services and is also not able to open a TCP/IP-connection to a foreign host to exchange data.
But what we need is a synchronous data exchange as, after pressing a button in SAP, we should query some database tables of another sub-system with JCaps and send back the received information to SAP.
Do you have any ideas out there how this synchronous request from SAP to JCaps can be fullfilled with JCaps (our version is 5.1.3)?!
We thought about using a HTTP server on the JCaps side, where SAP just sends a HTTP-request on the specified address and then we could use the data received from this call, to get data from the sub-system and then send it back to SAP over an RFC or something similar - that is the easier part (sending data back to SAP). The harder part, in my opinion, is to create a possibility for SAP to call JCaps immediately - so not asynchron, which we already implemented over a file export...
So, is it possible to use HTTP-server from JCaps for our needs?! Or is there another, easier possibility?!
Any help highly appreciated...
Regards
Bernhard BöhmHi Chris,
thanks for the input - we also have a similar thing running, also using our BW-Server (SAP ERP 6.0) as the "web service engine"....
But now, we want a solution without another server (like the BW in the upper case) involved!
So, we thought about using HTTP-server on the JCaps-side which should be invoked by a simple HTTP-request from SAP (also possible in 4.72).
Now I tried to setup a simple HTTP-Server project in JCaps 5.1.3 and it is making me crazy right now...
I just do not get it to work - all I would do is a simple JCD that just print a line in the log-file when started. The JCD has just a "processRequest"-method from HTTPS-Server-eWay. In the connectivity map I did set up the connection to the HTTP-Server with the servlet-url-name - property:
http://localhost:18001/dpListenHTTP_servlet_HttpServerServlet (like described in the userGuide).
But when trying to build the project I get this error:
com.stc.codegen.framework.model.CodeGenException: code generation error at = HTTP_Listen_cmListenHTTP_jcListenHTTP1 - HTTP Server e*Way Code GeneratorProblem creating war: C:\temp\dpListenHTTPprj_WS_serTestHTTP\12217262314811\WEB-INF\classes\..\dpListenHTTP_servlet_http:\localhost:18001\dpListenHTTP_servlet_HttpServerServlet.war (The filename, directory name, or volume label syntax is incorrect) (and the archive is probably corrupt but I could not delete it)
at com.stc.codegen.frameworkImpl.model.CodeGenFrameworkImpl.process(CodeGenFrameworkImpl.java:1569)
at com.stc.codegen.frameworkImpl.model.DeploymentVisitorImpl.process(DeploymentVisitorImpl.java:405)
at com.stc.codegen.frameworkImpl.model.DeploymentVisitorImpl.process(DeploymentVisitorImpl.java:308)
at com.stc.codegen.frameworkImpl.model.DeploymentVisitorImpl.traverseDeployment(DeploymentVisitorImpl.java:268)
at com.stc.codegen.driver.module.DeploymentBuildAction.loadCodeGen(DeploymentBuildAction.java:923)
at com.stc.codegen.driver.module.DeploymentBuildAction.access$1000(DeploymentBuildAction.java:174)
at com.stc.codegen.driver.module.DeploymentBuildAction$1.run(DeploymentBuildAction.java:599)
at org.openide.util.Task.run(Task.java:136)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:599)
Caused by: Problem creating war: C:\temp\dpListenHTTPprj_WS_serTestHTTP\12217262314811\WEB-INF\classes\..\dpListenHTTP_servlet_http:\localhost:18001\dpListenHTTP_servlet_HttpServerServlet.war (The filename, directory name, or volume label syntax is incorrect) (and the archive is probably corrupt but I could not delete it)
at org.apache.tools.ant.taskdefs.Zip.executeMain(Zip.java:509)
at org.apache.tools.ant.taskdefs.Zip.execute(Zip.java:302)
at com.stc.codegen.frameworkImpl.model.util.AntTasksWrapperImpl.war(AntTasksWrapperImpl.java:404)
at com.stc.connector.codegen.httpserveradapter.HSEWCodelet.generateFiles(HSEWCodelet.java:608)
at com.stc.codegen.frameworkImpl.model.CodeGenFrameworkImpl.processCodelets(CodeGenFrameworkImpl.java:640)
at com.stc.codegen.frameworkImpl.model.CodeGenFrameworkImpl.process(CodeGenFrameworkImpl.java:1546)
... 8 more
Caused by: java.io.FileNotFoundException: C:\temp\dpListenHTTPprj_WS_serTestHTTP\12217262314811\WEB-INF\classes\..\dpListenHTTP_servlet_http:\localhost:18001\dpListenHTTP_servlet_HttpServerServlet.war (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at org.apache.tools.zip.ZipOutputStream.<init>(ZipOutputStream.java:252)
at org.apache.tools.ant.taskdefs.Zip.executeMain(Zip.java:407)
... 13 moreAnyone any idea how to set up a HTTP-server-project?!
Thanks and regards
Bernhard Böhm -
Synchronous data collection using pci-6143's
I can set up synchronous data collection across the analog inputs of my three PCI-6143's using a separate task for each board and explicitly sharing the master timebase from board 1 (the one receiving the trigger to start data collection) to the other 2. Then I need 3 read channel VI's etc.
The DAQ Assistant will configure all the AI channels to work inside one task across the three boards, which is very convenient, but I lose the synchronicity. Specifically, the device triggering the data collection (board 1), leads the other two boards by a few microseconds. How can I use a single task for all three boards for analog input (voltages) while retaining completely synchronous data collection? Thanks!Hi Brian_g,
You should be able to synchronize your SMIO cards by including them in the same task this way. You will have to type in the names, ie "Dev1\ai0:7, Dev2\ai0:7, Dev3\ai0:7" and still specify the start trigger off of your master device. I would work from the "Cont Acq & Graph Int Clk.vi" example and add in the digital trigger.
Please post back if this does not resolve your issue or I didn't answer your question.
Cheers,
Andrew S.
National Instruments
Getting Started with NI-DAQmx
Measurement Fundamentals -
Can I take synchronous data from 2 NI9215/USB-9162's using VI-Logger Lite
I am a total noob, so this may be posted (although I have done a search and can not find the direct answer)
We have 2 NI-9215 / USB-9162 devices that we want to take synchronous
data from using VI Logger. When these devices were sold to us, we
were told that this was possible, but it appears as if it is not.
Both devices appear in the Devices and interfaces pull down, and I can
operate either one of them separately, but not together.
ThanksHi Ted,
Since you have to run the two acquisitions in different tasks, they are run independently and cannot be synchronized. Is there a way for you to specify a start trigger for the task? Also, what do you mean that "it doesn't like running two tasks at once"? Does it slow down your computer performance? What are the specs of your computer?
Regards,
Nicholas B, National Instruments -
Indesign CS4 - Error Synchronizing Data Panels
I have a user who is trying to synchronize their data panels which are stored on a file server. This has worked for the past few months, but yesterday she suddenly got the error that says 'Error writing data panel.' That is the only information given in the error message. The user has permission for full control over all files and folders where the data panels are located. Indesign has the correct path in its settings to the panels. Any ideas would be much appreciated.
I don't actually know waht a "data panel" is in ID? Could you explain it to me? is that the EXACT error message that you receive?
-
Missing Sync vs. PocketMac For Synchronizing Data between Blackberry and MAC
I'm looking for software to synchronize contacts, events, appointments, notes, tasks, etc., between my Blackberry Curve (8330 Series) and my iMac (MAC OS X 10.5.5). I've investigated Missing Sync and it certainly would work. Today I was advised that PocketMac will accomplish the same thing. So, I'm looking for a recommendation on the advantages/disadvantages of either or both packages.
Regards - rockberry
Solved!
Go to Solution.Both applications work well. Try PocketMac first and if it doesn't live up to your needs, move to Missing Sync.
1. If any post helps you please click the below the post(s) that helped you.
2. Please resolve your thread by marking the post "Solution?" which solved it for you!
3. Install free BlackBerry Protect today for backups of contacts and data.
4. Guide to Unlocking your BlackBerry & Unlock Codes
Join our BBM Channels (Beta)
BlackBerry Support Forums Channel
PIN: C0001B7B4 Display/Scan Bar Code
Knowledge Base Updates
PIN: C0005A9AA Display/Scan Bar Code -
Automatic synchronizing date and time
If this feature is not provided by the carrier, is there another way to get automatically synchronization to accurate time? I did not find any apps to sync the internal clock.
Hi eagink,
If it is just the one cell delete the data, reformat the cell and reenter the date/time. You are right tht there is soething in that cell thta Numbers will not recognize as date/time. If you need further help how about a screenshot of the stubborn cell?
quinn -
How do I make synchronous data calls
Hi for making synchronous call with java method from as file
i got example from
http://www.adobe.com/devnet/flex/articles/flexfaq.html
link 31Q. But i am not able to set with mxml file(how to). Can
anybody send me the sample example code for this.
ThanksFlex allows you to invoke remote calls to your business tier
in either an asynchronous or synchronous manner. By using an
asynchronous remote call, the user has the ability to perform some
action on the client and not be blocked as happens in traditional
web applications. You can block the user from interacting with the
UI using synchronous calls where appropriate.
i think here is the perfect tutorial for u on this link
http://www.onjava.com/pub/a/onjava/2004/12/01/flexjava.html?page=2 -
Synchronizing data acquisition&waveform generation
I'm attempting to synchronize analog waveform generation and analog data acquisition using an AT-MIO-16E-1 board. I've followed the instructions in the manual on how to do this but with no luck (maybe the VI I wrote is incorrect).
Any suggestions?Have you taken a look at the Simultaneous AI/AO examples that ship with NI-DAQ? They can be found in Examples>>I/O Interfaces>>Data Acquisition>>Simultaneous AI/AO. They will give you some examples of how to program your board.
Regards,
Erin -
Synchronizing data between viewStack elements
When a user clicks on a container built with repeated array
collection
elements in one viewStack layer, the selected element needs
to be
utilized to populate the data in a second viewStack layer and
vice-a-versa.
Conceptually how does one do this? Do I set some type of
global
variable|pointer or pass the objects from one view to the
other somehow
or can one view layer be aware of another's data?
I suspect this is not a detailed enough description, please
feel free to
ask questions to help me describe the specifics.michael_ramirez44 wrote:
> Could you provide a small example of what you are trying
to do?
As promised, a concept of what I am trying to do. As you can
see in my
root application, MobileCalendar.mxml, I am getting data from
a
RemoteObject call. This is returning an array collection
consisting of
28, 35 or 42 elements. Each element is an object containing
several
properties, including one which is also an array collection.
Then I
define a two element view stack.
In the first view stack element is the Calendar.mxml
container which
uses the array collection in a repeater control to create a
DayBox
container for each element. Inside the DayBox.mxml container
is
repeater control that uses the array collection property of
the element
used to create each DayBox.
Then there is the second element of the view stack that will
be a
'detail' view based on which element was selected in the
above DayBox.
In this Details.mxml there is a two element HDividedBox. The
first
element will display the details of the element used to
create the
daybox that contains the element the user selected, and the
second
element will display the details of the sub element the user
selected.
I have this currently working by using global variables to
store
references|copies? of the selected element. What I'm hoping
to discuss
is the merits of this concept and possible other techniques.
Thanks to anybody you read all this. Not as short as I hoped.
MobileCalendar.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml"
layout="absolute"
minWidth="940" creationComplete="getCalendar()"
xmlns:mcViews="Flex.Views.*">
<mx:RemoteObject
id="mobCalCFC"
destination="ColdFusion"
source="CFC.MobileCalendar"
showBusyCursor="true"
fault="mobCalCFC_faults(event)">
<mx:method name="test" result="test_handler(event)"/>
<mx:method name="getDays"
result="getDays_handler(event)"/>
</mx:RemoteObject>
<mx:ViewStack id="mobileCalendarViewStack" left="10"
top="10"
bottom="10" right="10">
<mcViews:Calendar
id="calendarDisplay" label="Mobile Calendar"
width="100%" minWidth="0"
height="100%" minHeight="0" />
<mcViews:Details
id="eventDetails" label="Details"
width="100%" minWidth="0"
height="100%" minHeight="0" />
</mx:ViewStack>
</mx:Application>
Calendar.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel
xmlns:mx="
http://www.adobe.com/2006/mxml"
layout="vertical"
title="Mobile Calendar"
left="10" top="10" bottom="10" right="10"
xmlns:mcViews="Flex.Views.*">
<mx:VBox width="100%" height="{parentDocument.height -
195}"
paddingLeft="5">
<mx:Repeater
id="weekRows"
dataProvider="{weekStartsAry}">
<mx:HBox width="100%" horizontalGap="5">
<mx:Repeater id="dayCells"
dataProvider="{parentApplication.daysAry}"
startingIndex="{weekRows.currentItem}" count="7">
<mcViews:DayBox
dayData="{dayCells.currentItem}"
width="14.25%" minWidth="0"
height="100%" minHeight="0"/>
</mx:Repeater>
</mx:HBox>
</mx:Repeater>
</mx:VBox>
</mx:Panel>
DayBox.mxml
<mx:VBox
xmlns:mx="
http://www.adobe.com/2006/mxml"
borderStyle="solid"
horizontalScrollPolicy="off"
backgroundColor="white">
<mx:HBox horizontalAlign="right"
backgroundColor="{(dayData.inMonth) ?
0x002649 : 0x8093A4}" width="100%">
<mx:Repeater id="draws"
dataProvider="{dayData.drawsQry}">
<mx:VBox
id="drawDetails"
verticalGap="0"
paddingLeft="5" paddingRight="5"
click="viewDetails(dayData,event.currentTarget.getRepeaterItem())"
styleName="{draws.currentItem.N_LOC_AREA}">
<mx:Label
text="{draws.currentItem.R_MOB_MNAME}"
toolTip="{draws.currentItem.R_MDL_MOBLID} {draws.currentItem.R_MOB_MNAME} AM:
{draws.currentItem.R_RCT_NAME}"
width="100%" minWidth="0"
truncateToFit="true"/>
</mx:VBox>
</mx:Repeater>
</mx:VBox>
Details.mxml
<mx:HDividedBox
xmlns:mx="
http://www.adobe.com/2006/mxml"
x="0" y="0"
xmlns:mcView="Flex.Views.*">
<mcView:Detail_Day
id="showme"
x="0" y="185"
width="20%" minWidth="0"
height="100%" minHeight="0"/>
<mx:Panel
title="{parentApplication.displayDraw.R_MOB_MNAME}"
width="80%" minWidth="0"
height="100%" minHeight="0"
layout="absolute">
</mx:Panel>
</mx:HDividedBox> -
Synchronizing data to the iPhone
Hi there!
Is there a thing like the MS Sync. Framework for iPhone?
If I would like to sync data to the iPhone, how should I go about it:
1) Use MobileMe - some kind of Web Service?
2) Through iTunes?
3) Or iSync?
Have anyone done this outside the inner circle of big software companies with connections to Apple
Thanks in advance!
Regards
ChristianHi Claudio,
I am planning to try that (export/import to gdata) also. Can you give any tips on how you got it to work? I tried adding the entire gdata framework, but it turned out to be huge, and also didn't compile for me anyway. I'm trying to install something like that manually, but so far, it's too opaque for me to figure out. Do you use java calls or just html???
thanks
Rick -
Best way of synchronizing data
Hi Oracle gurus,
We have 2 db's A & B.the whole question is we need to replicate some 20 odd overlapping elements in B to A whenever there is a DML operation on A.Question no:1 is whether we can impart a time stamp & a flag for DML in the interstaging DB using oracle repl,ication ? Qusetion 2 is what is the best process for such a situation ?
Thanks
HariHi Oracle gurus,
We have 2 db's A & B.the whole question is we need to replicate some 20 odd overlapping elements in B to A whenever there is a DML operation on A.Question no:1 is whether we can impart a time stamp & a flag for DML in the interstaging DB using oracle repl,ication ? Qusetion 2 is what is the best process for such a situation ?
Thanks
Hari -
Synchronizing data from two folders
It would be nice to be able to synchronize the description and keyword fields(possibly others) from two folders containing the same images(file numbers, different extension).
I keyword my images right after importing in Bridge and then convert them to .tif. Every now and then I add keywords to some .tif files that I feel needs them. This makes my .tif files different than my RAW files (either .dng or .psd). Having a synchronize window where you could select the folder with the updated keywords and then the one that you want to update and simply "hit" synchronize would be very handy.Hi Leah
You could be in a fan trap situation. Is this possible? Could you perhaps have disabled the fan trap protection? If you do this and there is a fan trap then you can have issues with aggregations not working. This is correct too. I have known companies where they then export to Excel, get Excel to add the values and then say this is proof that Discoverer is no good. I tell them to go and look at the values manually and usually find that the answer in Excel is wrong.
If you are not in a fan trap situation you need to look at the underlying objects. I know you said you have an outer join which is fine. Now outer joins will bring back NULL values when there are no entries in the joined to object. If you do have such values being returned then you may not be able to aggregate them because if you try to SUM values with a NULL the answer will be NULL.
One way to knock out NULL values in an OUTER joined object is to use a Boolean OR+ condition. Let's say you have two folders, A and B, and you want to exclude values from B where say the AMOUNT is NULL. This condition will do the trick:
B.AMOUNT IS NOT NULL OR B.AMOUNT IS NOT NULL
I know it looks crazy but Oracle wrote special code into Discoverer that looks for this situation. Discoverer now rewrites the query to use a subquery thus overcoming the OUTER join restriction.
By the way this works too: B.AMOUNT IS NULL OR B.AMOUNT IS NULL - this one only brings back rows which have NULL in B.
Best wishes
Michael -
A software application was developed to collect and process readings from capacitance sensors and a tachometer in a running spin rig. The sensors were connected to an Aerogate Model HP-04 H1 Band Preamp connected to an NI PXI-6115. The sensors were read using AI Config and AI Start VIs. The data was saved to a file using hsdlConfig and hsdlFileWriter VIs. In order to add the capability of collecting synchronized data from two Eddy Current Position sensors in addition to the existing sensors, which will be connected to a BNC-2144 connected to an NI PXI-4495, the AI and HSDL VIs were replaced with DAQmx VIs logging to TDMS. When running identical tests, the new file format (TDMS) produces reads that are higher and inconsistent with the readings from the older file format (HSDL).
The main VIs are SpinLab 2.4 and SpinLab 3.8 in folders "SpinLab old format" and "Spinlab 3.8" respectfully. SpinLab 3.8 requires the Sound and Vibration suite to run correctly, but it is used after the part that is causing the problem. The problem is occuring during data collection in the Logger segment of code or during processing in the Reader/Converter segment of code. I could send the readings from the identical tests if they would be helpful, but the data takes up approximately 500 MB.
Attachments:
SpinLab 3.8.zip 1509 KB
SpinLab 2.4.zip 3753 KB
SpinLab Screenshots.doc 795 KBFirst of all, how different is the data? You say that the reads are higher and inconsistent. How much higher? Is every point inconsistent, or is it just parts of your file? If it's just in parts of the file, does there seem to be a consistent pattern as to when the data is different?
Secondly, here are a couple things to try:
Currently, you are not calling DAQmx Stop Task outside of the loop; you're just calling DAQmx Clear Task. This means that if there were any errors that occured in the logging thread, you might not be getting them (as DAQmx Clear Task clears outstanding errors within the task). Add a DAQmx Stop Task before DAQmx Clear Task to make sure that you're not missing an error.
Try "Log and Read" mode. "Log and Read" is probably going to be fast enough for your application (as it's pretty fast), so you might just try it and see if you get any different result. All that you would need to do is change the enum to "Log and Read", then add a DAQmx Read in the loop (you can just use Raw format since you don't care about the output). I'd recommend that you read in even multiples of the sector size (normally 512) for optimal performance. For example, your rate is 1MHz, perhaps read in sizes of 122880 samples per channel (something like 1/8 of the buffer size rounded down to the nearest multiple of 4096). Note: This is a troubleshooting step to try and narrow down the problem.
Finally, how confident are you in the results from the previous HSDL test? Which readings make more sense? I look forward to hearing more detail about how the data is inconsistent (all data, how different, any patterns). As well, I'll be looking forward to hearing the result of test #2 above.
Thanks,
Andy McRorie
NI R&D -
Imlementing synchronized access to shared objects in LabVIEW OOP
Many objects in object-oriented programming have an
identity, such as a file, a front-panel object or a hardware device.
These objects cannot be modelled using present LabVOOP (LabVIEW Object Oriented Programming) objects as
LabVOOP objects gets copied as wire is branched; multiple different
wires cannot all represent a single object. This issue has been
irritating the community of LabVIEW users since the release of LabVOOP
a few months ago.
It seems that there is a huge demand for
objects with unique identity i.e. by-reference objects in LabVIEW. The
central problem why LabVOOP propably doen't have these objects is the
difficulty in implementing synchronized access to these objects from
multiple parallel threads. The problem of synchronized access can be
divided into two different separate topics. First how the
sychronization should be implemented in LabVIEW runtime engine. Second
how this synchronization mechanism should be visible to the developer.
I'd like to start this thread to discuss these two issues.
Synhronization under the hood
Traditionally
people talk about locking of an object and about get-modify-set pass
when accessing the object. Locking is traditionally done by acquiring a
mutex for an object, modifying the object and releasing the mutex so
that other threads can access the same object instance. This is how
inter-thread synchronization is traditionally done. However, besides
the mutex based locking, the computer science community has innovated
also different kinds of methods on synchronizing the access to objects.
One way to get object-level synchronization is modify the
runtime engine so that it only allows a single method of a synchronized
object to run at any time. This mechanism of syncrhonization is
implemented in programming languages like O'Haskell, which is a Haskell
variant with object orirented features.
Also different
transactional mechanisms[1,2] have been successful. In transactional
mechanisms multiple threads are allowed to access a synchronized object
simultaneously. As each method accessing an object commits their
changes, they verify that no other object has modified the object
simultaneously in a manner than would break the transaction. If such a
modification has occurred, everything is rolled back. Transactional
mechanism do not suit to every possible situation as not everything can
be rolled back. For example it's hard to roll back an action that
somehow modifies the physical world.
User experience of synchronization
How
the synchronization is generally implemented in LabVIEW shouldn't be
directly visible to the developer end-user. The developer should
understand the general concepts of synchronization to take full
advantage of it, but in general the synhronization mechanism should be
integrated directly to development environment. There should in general
be no need to acquire a mutex by calling acquire mutex node but instead
the end-user should be able to specify which data needs synhronized
access in more sophisticated way.
In the following I propose a
mechanism of integrating the synchronized access of by-ref objects to
the development environemnt of LabVIEW. The proposal is very
preliminary but I hope it breaks the ice and the community would start
innovating in how should NI implement the syncrhonization support in
the user interface of LabVIEW.
Wire level synchronization
Only
methods can access object private data members. In synchronized access
to the object, it's the methods accessing the private data members that
need to be synchronized. The private data members are accessed by
applying unbundle node to the class wire and data is written back to
the object using bundle node.
What I propose is the following.
An unbundle node could either be normal or "synchronized". A
synchronized unbundle would guarantee the access to the private data
members in synchronized manner. All data wires originating from
synchronized unbundle would be of synchronized type, in a little
similar manner as a dynamic dispatch wire is of special dynamic
dispatch type. Such a wire must evetually be connected to a bundle
node. When the wire is bundled back to the originating object, the
synchronization requirement is released.
These synchronized
wires would look somewhat different from normal wires so that the
developer instantly knows that the wire is synchronized. The developer
can branch the wire, but only one wire branch can own the synchronized
type. The developer could easily select which wire would be
syncrhonized by Ctrl+clicking the wire. Such a wire can be considered
as a combination of a data and a mutex, even though mutexes don't need
to be the underlying synchronization method. The wire just guarantees
that there is a mechanism in the runtime engine that makes sure the
access to the wire data is synchronized.
There is a need to wire
data originating from a non-synchronized wire to a synchronized wire so
that it can replace the private data member of the class. This is
accomplished with a new node similar to bundle node, that would allow
replacing the data in a syncrhonized wire with some data originating
from a non-synchronized wire.
The synchronized wire can be
connected to a front panel controls of special syncrhonized type. This
way the synchronized wire can originate from a method and allow passing
the synchronized data to the calling VI and back to another method.
This is practical for example in a situation when the developer wants
to run different analyzes to a data class but don't want to rewrite all
the existing data analysis tools as class members. So the developers
writes a syncrhonization acquiring getData method that let's the
calling VI to access the syncrhonized data. Then the developer passes
this data to an analysis VI and passes the result back to a setData
method that writes the result back to the class wire.
There
will probably be technical problems in allowing the user to connect
such a synchronized wire to all existing VIs since these VIs. Therefore
the programming model for all nodes that do not support such
synchronized wires will be branching the wire and passing the
non-synchronized wire branch to the node and then bundling the result
back to the synchronized wire.
To increase performance and
decrease unnecessary buffer copies when a syncrhonized wire is
branched, if the syncrhonized wire continues directly to the new bundle
synchronized wire node, no buffer copy is made.
Discussion
The
syncrhonized access to a by-ref LabVOOP objects can be implemented in
multiple ways by National Instruments. The synchronized access should
be divided to two different and independent parts: 1) the user
experience of synchronization and 2) the runtime engine synchronization
mechanisms. As LabVOOP objects have special properties compared to
other LabVIEW data types, optimal user experience can be gained by
designing the user experience specifically for LabVOOP objects. From
user experience point-of-view this syncrhonization mechanism may not
work for other data types. Separating object syncrhonization from
synchronization of other data types is advantageous also for other
reasons. Due to the fact that object data can only be accessed via
object methods, more advanced synchronization methods may be used with
objects than can be used with other data types. O'Haskell
synchronization implementation is an example of this. Integrating the
synchronization directly to the user interface allows NI to change the
mehcanisms under the hood, when computer science comes up with more
advanced methods. Therefore NI could begin with traditional and quite
easy mutex-based synchronization and later move to more advanced
perhaps transaction based syncrhonization methods or even combinations
of multiple different methods.
I hope this topic generates
discussion that would help NI to implement an excellent synchronization
mechanism in LabVOOP. I hope that all talented individuals in the
community participate this discussion to help NI to reach this goal. I
also hope that if you just have time, it would be great if you could
surf the computer science resources to find out what kinds of new
techniques there exists for synchronizing access to shared resources. A
Large community may find much more innovative solutions than a few engineers at NI. Let's give NI the power of open source design
Tomi MailaHello Tomi,
First, thank you for taking the time to write such a well
though-out suggestion. Are you familiar
with the “LabVIEW Object-Oriented Programming: The Decisions Behind the Design”
document? I think the reason we chose to implement a ‘by
value’ strategy, is that is more in line with the LabVIEW programming paradigm
of dataflow, and would make sense to most of our LabVIEW users.
I think your suggestion is interesting, and it does
highlight the need to think outside of the conventional LabVIEW box and look to
some of the innovative things other languages do. However, I think we all agree that
synchronization takes careful planning and extra work for the programmer. Even with an ‘ideal’ solution I see no way
around this. For LabVIEW users today,
one great way to get synchronized ‘by reference’ semantics with your objects is
to use a single-element queue to pass your object. The queue itself is passed ‘by reference’ and
is inherently synchronized! The does
have the disadvantage of adding one more small layer of complexity to your
program, but some complexity would have to be introduced in any situation. The other disadvantage with this is that it
is not always an intuitive way to implement your program and requires some
amount of LabVIEW knowledge before one would generally come across this
technique.
In any case, I appreciate the time and effort you put in to
your suggestion. Please make sure that
you submit the suggestion formally through the NI Product Suggestion Center so
that it can be reviewed by some of the decision makers here.
Thanks again,
Travis M
LabVIEW R&D
National Instruments
Maybe you are looking for
-
Boot Camp - Parallels - Windows 7 - 32bit - 64bit
Hi. First off, and not looking for sympathy - just a little background of myself: I have recently recovered from two bouts of high dose chemo and a stem cell transplant. My memory and brain...processing speed, for lack of correct word or two, is no w
-
How to set up additional iCloud email
How can I set up an additional icloud email address? I already have an icloud account using my domain name and wish to set up an icloud.com address as well.
-
Convert Purchase requisitions to Purchase order
Hi, Need help. How can I Convert Purchase requisitions to Purchase order in one line (automatically created purchase requisitions in sales order), when I adopt purchase requisitions in delivery schedule tab it gives me an error: Requisition 10000###,
-
Search in "form" and not only in spreadsheet...
Hi, this Numbers is very great!! But there are 2 important features to add in "forms". 1. Most important is the possibility to search in a "form" and not only in spreadsheet. I don't know why they don't add this feature.... 2. Possibility to input th
-
I get a please wait message that sez
pdf viewer cannpt display the page I have downloaded latst version. still can't open doc. opens other docs