|
Thanks Lisa
Live in fragments no longer. Only connect.
|
|
|
|
|
i am creating an application that sends something on the parallel port(d0-d7) and then reads 3 status registers...i was able to send the data using inpout32.dll but i do not know how to read the status registers...my app has to listen for any changes of these status registers and act acording to the changes...if anyone could help i would appreciate it
|
|
|
|
|
|
Hello all.
I've got a common multithreading predicament that might look easy to solve, but I'm looking for best practice. I got some sloppy ideas myself, but I'd like to hear what should be best used in this situation.
1- I'm fetching data from the network server -No problem. Takes about 3-7 secs-.
2- Then I'm populating/refreshing a TreeView from that DataTable which could contain up to 30,000+ records. This is the problem as this takes about 2-3 mins.
I can't allow step two to hold off the user for 2-3 mins until the list is filled. I decided to make another thread to fill up the TreeView while the user still can interact with the rest of the UI. Two questions:
1- Is it normal that a TreeView takes 2-3 mins on a modern Centrino 1.83 laptop with 1.5 GB RAM to add 30,00 nodes? How to speed it up?
2- I got a refresh button that should cancel that active thread, clear the TreeView, then refresh it with node. If I press it twice quickly with my current code, the UI freezes. Any ideas?
If you need to take a look at my sloppy code -Here! Have a nice laugh at it!-, here it is:
private bool StopPopulating;
private delegate void ClearDel();
private delegate TreeNode AddDel(string text);
internal void PopulateList()
{
if (!IsPopulating && StopPopulating)
return;
IsPopulating = false;
StopPopulating = true;
while (Populator != null && Populator.IsAlive)
Thread.Sleep(1);
Populator = new Thread(new ThreadStart(PopulateMethod));
Populator.IsBackground = true;
Populator.Priority = ThreadPriority.Lowest;
IsPopulating = true;
StopPopulating = false;
Populator.Start();
}
private void PopulateMethod()
{
lock ("Populating")
{
try
{
ClearDel clearing = new ClearDel(Patients.Nodes.Clear);
AddDel adding = new AddDel(Patients.Nodes.Add);
Patients.BeginInvoke(clearing);
CathProxy PatientsProxy = (CathProxy)Activator.GetObject(typeof(CathProxy), CathLab.Url);
DataTable mvps = new DataTable();
DataTable Pts = PatientsProxy.GetList(out mvps);
TreeNode CurrentNode;
foreach (DataRow r in Pts.Rows)
{
if (StopPopulating)
return;
CurrentNode = (TreeNode)Patients.EndInvoke(Patients.BeginInvoke(adding, new object[] { '(' + r["Hospital_Number"].ToString() + ") " + r["Patient_Name"].ToString() }));
foreach (DataRow ro in mvps.Rows)
{
if (r["Hospital_Number"].ToString() == ro["Hospital_Number"].ToString())
{
AddDel curadd = new AddDel(CurrentNode.Nodes.Add);
Patients.BeginInvoke(curadd, new object[] { "MVP at " + DateTime.Parse(ro["Procedure_Date"].ToString()).ToShortDateString() });
}
}
}
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message, "Error populating patients list");
}
finally
{
IsPopulating = false;
}
}
}
waiting for bright ideas as I'm out of caffeine!
Regards
|
|
|
|
|
1. I don't have a direct comparison, but 2-3 minutes to create a 30,000 node TreeView seems slow. I think your performance problem is due to two things: making individual TreeView updates and making those updates via individual BeginInvoke() calls. On my 1.63GHz Core2 Duo, it takes about 45 seconds when updates are performed individually from within a loop on the UI thread. When batching the updates, that time was cut down to 20 seconds.
Using Control.Invoke() or Control.BeginInvoke() is a relatively expensive operation due to all of the coordination necessary to shift to and execute the delegate on the UI thread. While it's necessary in order to update the UI from a worker thread, it should not be used in "tight loop" situations. Instead, one should make a single Invoke()/BeginInvoke() call and make *all* the updates from within that single delegate.
This model also allows one to make use of the Control.BeginUpdate() and Control.EndUpdate() methods. These disable and reenable drawing of the control. By adding your new nodes in between those method calls, the system will add them without repeatedly refreshing the control display, and therefore, will add them more quickly.
2. You're likely seeing the UI freeze due to your Thread.Sleep(1) in your PopulateList() method. If this is being called on the UI thread, it effectivly stops the Windows message pump until the thread exits. Blocking on the UI thread is strongly discouraged. If your thread is also interacting with the message pump (e.g. by making Control.Invoke() calls), you could also be setting up a deadlock situation.
One trick to prevent the "impatient user multiple-click" is to disable the button on the first click and only reenable it once the resulting action is complete.
-Phil
|
|
|
|
|
 Thanks for your very valuable help. I really appreciate it.
Actually about the "impatient user multiple-click" issue. The list is updated by several events, so I can't really have control on the refreshing. I need that when the user triggers an event that requires refreshment that the current thread is gracefully terminated, and a new thread started again.
I've made a few adjustment to the code. Now My main thread freezes even though I use BeginInvoke(). Any idea way.
internal void PopulateList()
{
Populator = new Thread(new ThreadStart(PopulateMethod));
Populator.IsBackground = true;
Populator.Priority = ThreadPriority.BelowNormal;
IsPopulating = true;
StopPopulating = false;
Populator.Start();
}
private void PopulateMethod()
{
lock ("Populating")
{
try
{
CathProxy PatientsProxy = (CathProxy)Activator.GetObject(typeof(CathProxy), CathLab.Url);
DataTable mvps = new DataTable();
DataTable Pts = PatientsProxy.GetList(out mvps);
updateDel update = new updateDel(UpdateList);
this.BeginInvoke(update, new object[] { Pts, mvps });
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message, "Error populating patients list");
}
}
}
private void UpdateList(DataTable Pts, DataTable mvps)
{
Patients.Nodes.Clear();
TreeNode PleaseWait = Patients.Nodes.Add("Refreshing list. Please Wait");
Patients.BeginUpdate();
foreach (DataRow r in Pts.Rows)
{
if (StopPopulating)
return;
TreeNode CurrentNode = Patients.Nodes.Add('(' + r["Hospital_Number"].ToString() + ") " + r["Patient_Name"].ToString());
foreach (DataRow ro in mvps.Rows)
{
if (r["Hospital_Number"].ToString() == ro["Hospital_Number"].ToString())
CurrentNode.Nodes.Add("MVP at " + DateTime.Parse(ro["Procedure_Date"].ToString()).ToShortDateString());
}
}
PleaseWait.Remove();
Patients.EndUpdate();
IsPopulating = false;
StopPopulating = false;
}
Thanks again for your time.
Regards
|
|
|
|
|
Under what conditions does the UI freeze? Is it a complete freeze, or does the UI respond after some period of time? I noticed in your UpdateList() method that you do not call Patients.EndUpdate() if your update is interrupted; you should probably put that in a finally statement so that it is always called.
-Phil
|
|
|
|
|
Thanks to your help I managed to reduce the time to 17 seconds. My UI freezes these 17 seconds when it adds the nodes between the BeginUpdate() and EndUpdate() calls. I discovered that adding the nodes to the TreeView can not be done except on the main thread, so I called a DoEvents() in the loop and the freeze is gone.
I can't have gone this far without your help. I really appreciate it.
Thanks again.
Regards
|
|
|
|
|
Hi all,
To develop a game USING C#, i got the option to use XNA....
Would it work with :-
Visual Studia 2005 Proffesional edition
I guess to use XNA i have to install VS2005 express edition and now to install that i need to uninstall my proffesional version....
Is that true or would that work..
And what about the video card version ?
I guess by going to BIOS i can get the video card info as it supports only Direct3d 9.0 video card..
What do you suggest, should i use Direct X 0 version or should go with XNA by overcoming all the complexities as i dont want to uninstall VS proffeional version .
Or if there is hardly much difference in both prof and express then i might do that aswell...
overall which is better to use XNA Or DirectX or OpenGL(i dont know if it supports C#.net)
Please suggest....
Thanks
|
|
|
|
|
There are many options to develop games in C#. This includes using OpenGL libraries, managed/unmanaged DirectX libraries, or XNA.
Using unmanaged libraries like OpenGL, would require using something called P/Invoke. This is quite tedious, but possible. Also it won't be as fast as C++, but still quite satisfactory.
On the other hand, Microsoft has already provided managed DirectX library that you can use directly from your C# code. Again it's not as fast as the unmanaged code, but it should be in the future. I also think that DirectX 10 is managed, and the entire Windows Vista development will be built on C#, though C++ would still be an option, but it no longer would be number one in a few years. Still to early to say, but things are moving to DotNet.
XNA is an early immature games developing framework. You can also try it directlt from your C# code. It's quite like DirectX I think, but a little easier. From the Download page I quoted this line:
"However, other members of the Visual Studio 2005 line of products, for example Visual Studio 2005 Professional, can co-exist with XNA Game Studio Express on the same computer. "
I didn't try it, but I think if you installed it on your proffessional edition, it should work fine. Otherwise you can install the express edition without uninstalling the proffesional edition.
Regards
|
|
|
|
|
Thanks for your reply..
As you said OpenGL would be tedious, so i guess i would rather go with DirectX or XNA.
i guess direct x 9 and above supports C# but i really dont know which option would be best for beginner...XNA or directX.
Or should i try both and decide it....
Confusion...
But overall i guess there is no much difference in creating games using C# or C++.
C# is bit new for this but i guess its not bad at all for creating game...
What do you say ?
Thanks 
|
|
|
|
|
Software_Specialist wrote: which option would be best for beginner...XNA or directX.
I haven't worked with XNA, but I believe you should give it a try first before you would take a look at DirectX.
Software_Specialist wrote: Or should i try both and decide it....
Well, atlest have an idea about how both work, and grasp the basics of each. Sure it would be better than holding on to one only.
Software_Specialist wrote: But overall i guess there is no much difference in creating games using C# or C++
Sure there is. Pointer for one is a major difference.
Software_Specialist wrote: C# is bit new for this but i guess its not bad at all for creating game...
No body said that. All am talking aout is that it's getting better. Some people would say that its performance is unsatisfactory. Others say its fine. if you are a beginner, then C# would wuit your needs.
Regards
|
|
|
|
|
Software_Specialist wrote: I guess to use XNA i have to install VS2005 express edition and now to install that i need to uninstall my proffesional version....
Then you guessed wrong. I have both professional and Express editions installed side by side and it causes no problems.
Software_Specialist wrote: should go with XNA by overcoming all the complexities as i dont want to uninstall VS proffeional version .
You don't have to uninstall VS professional edition. Where did you hear that anyway?
|
|
|
|
|
Oh yeh i was wrong it was for the beta version....
Not for prof...I guess i should give it a try with XNA..
Ill download this express version now..
Thanks..
|
|
|
|
|
Dear all,
I want read Excel file and create another new Excel file with the data inside a first file. how can select a Column in a Excel file than compare this Column to another and so on, than colect this columns and create a new file from that colected columns.
-- modified at 17:49 Saturday 13th January, 2007
|
|
|
|
|
Office applications expose a COM-based object model. If using .NET, they also include PIAs (Primary Interop Assemblies) that wrap the object model in a slightly more .NET-friendly manner. You could use this model to open, extract from, and write to Excel files.
See: Excel Object Model[^]
-Phil
Disclaimer: I work for Microsoft as a developer on the Visual Studio Tools for Office product team.
|
|
|
|
|
|
hi
i want to manage device(s) (for example send/recieve date) from usb device. does anybody can help me (tutorial,article,sample or ...) ?
thanks
|
|
|
|
|
|
Say some of our program resource is on CD, but we don't know which one (and want to use any available), what is best way to check available drives, and then check if disk we want is one of them?
|
|
|
|
|
If using .NET 2.0 there is System.IO.DriveInfo which gives you:
- all the drive letters
- so scan them one by one, and for each drive
- check drive type (check for DriveType.CDRom)
- check volume label (check for your CD's label).
If using .NET 1.1 you can follow the same scheme, but you would need PInvoke to
Win32 functions such as GetVolumeInformation (And that's exactly what I did today !)
Luc Pattyn
|
|
|
|
|
Visual C# 2005 EE so it's 2.0, I'll try that now...
|
|
|
|
|
OK got it thanks...
link for good example on that:
http://msdn2.microsoft.com/en-us/library/system.io.driveinfo.getdrives.aspx
|
|
|
|
|
hi all
i install vs2005 and msdn 2005,but msdn does not exist in my visual studio IDE,how to confugure it correctly ?
thanks.
|
|
|
|
|
As far as I know it involves a re-install.
I have no idea what I just said. But my intentions were sincere.
|
|
|
|