|
I think the sqldmo.dll is replaced with a new sqldmo.dll (came with Express edition)
try finding it from another machine and copy it to System32 folder than
use regsvr32
i hope it works!
|
|
|
|
|
Thanks.
I uninstalled and reinstalled and it is all good now. Teaches me for installing it when I have other work to do.
Should of known better.
|
|
|
|
|
I am trying to figure out how to sent an event or set a callback when a thread finishes its work.
Lets say that I have 3 functions called:
1) GetData1()
2) GetData2()
3) GetData3() Each function depends on the results of the prior function in order to be able to do its work.
These threads cannot block the main application thread.However, GetData1() may block GetData2() and GetData3()
and GetData2() can block GetData3()
Each of these worker threads make calls to and XML server, and when a given thread finishes I need to start the next one.
The threads can take a long time to complete their task, meaning minutes and not milliseconds etc.
How can I know when a previous thread has finsihed?
Thanks
-- modified at 15:10 Wednesday 14th December, 2005
|
|
|
|
|
You can pass a delegate into the various BeginInvoke methods to have a function execute when the thread is done. For example,
ThreadStart method1 = GetData1();
method1.BeginInvoke(myCallbackFunction, null);
...
void MyCallbackFunction(IAsyncResult result)
{
}
Does this help? Or am I not understanding your problem?
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Bought a House!
Judah Himango
|
|
|
|
|
Hehe, stupid of me this is also a solution.
WM.
What about weapons of mass-construction?
|
|
|
|
|
This seems to be what I am looking for.
The snipit you provided doesn't compile, but I can look up the syntax.
|
|
|
|
|
It should compile under .NET 2.0 syntax (where delegates can be inferred from the method passed). If you're not using a C# 2.0 compiler, you'll need to explicitly create the delegates:
ThreadStart method1 = new ThreadStart(GetData1);
AsyncCallback callback = new AsyncCallback(myCallbackFunction);
method1.BeginInvoke(callback, null);
...
void MyCallbackFunction(IAsyncResult result)
{
}
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Bought a House!
Judah Himango
-- modified at 15:40 Wednesday 14th December, 2005
|
|
|
|
|
Thanks that did the trick.
Sorry, but I am still in the stone ages using .net 1.1 and Visual Studio 2003
Thanks again
|
|
|
|
|
Well, it compiles but it doesn't ever call the callback function
Here is my callback function
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
MessageBox.Show( "Callback triggered");
}
Here is how I am calling it
ThreadStart method1 = new ThreadStart(RequestVehicles);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
Thread tThread = new Thread( method1 );
tThread.IsBackground = true;
tThread.Start();
Have I done something wrong?
-- modified at 17:19 Wednesday 14th December, 2005
|
|
|
|
|
In that code snippet, you're calling RequestVehicles 2 times: once when you call method1.BeginInvoke method, and again when you explicitly create your Thread and call .Start on the thread. Just remove that explicit thread creation, it's redundant. Your code should look like:
ThreadStart method1 = new ThreadStart(RequestVehicles);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
MessageBox.Show( "Callback triggered");
}
Note that if you used
Thread t = ...
t.Start()
it will not call any callback method. Only BeginInvoke does that.
|
|
|
|
|
Thanks I will try that directly
|
|
|
|
|
Sounds rather complex, let me think:
Every process should have some kind of semaphore. GetData2 should call wait on the semaphore of GetData1. GetData1 should call signal on the semaphore it has, so that GetData2 continues. GetData3 should call wait on the semaphore of GetData2 and GetData2 should call signal on the semaphore it has, to let GetData3 continue.
This should work just fine and you dont have to worry about a lot of the synchronisation here There are other ways to do this, but this is by far the simplest solution I can think of.
WM.
What about weapons of mass-construction?
-- modified at 15:21 Wednesday 14th December, 2005 (Fixed some minor spelling issues )
|
|
|
|
|
Although it seems you already found a solution just another question:
If those three threads get executed sequentially (one after the other) why don't you just call all three methods in a single thread?
|
|
|
|
|
|
I used a combination of both tips
ThreadStart method1 = new ThreadStart(DoRequests);
AsyncCallback callback = new AsyncCallback(MyCallbackFunction);
method1.BeginInvoke(callback, null);
void DoRequests()
{
RequestVehicles();
RequestCustomers();
RequestServiceSales();
}
void MyCallbackFunction(IAsyncResult result)
{
if( result.IsCompleted )
{
}
}
Thanks All
|
|
|
|
|
I made a windows form app that executes a query to an Oracle database. It takes about 5 seconds for the query to execute. If a user presses the button and it takes 5 seconds, they might think its not working.
I want to display a message while it executes the query. The whole query is wrapped up in a function called “ConnectToOracle()”. Obviously it is of type void. I tried to make a while loop that did this…
ConnectToOracle();<br />
<br />
While (ConnectToOracle)<br />
<br />
{<br />
<br />
Label1.visible = true; <br />
<br />
}
It gave me an error that said cannot implicitly convert type ‘void’ to ‘bool’.
Is there anyway I can do this??
Thank you!
Apoc
|
|
|
|
|
Alternately put the label display calls inside ConnectToOracle() on either side of the db operations. You should consider doing this in a seperate thread though so it doesn't lock the GUI.
<br />
void ConnectAndShowWait()<br />
{<br />
Label1.visible = true;<br />
<br />
ConnectToOracle();<br />
<br />
Label1.visible = false;<br />
}
|
|
|
|
|
A while clause expects a boolean value. while(somethingIsTrueOrFalse). Since ConnectToOracle is returning void, while won't work.
What you need is a seperate thread of execution to connect to the database, keeping your UI thread alive and functional. To do this:
using System.Threading;
ThreadStart methodToExecute = new ThreadStart(ConnectToOracle);
Thread oracleReaderThread = new Thread(methodToExecute);
oracleReaderThread.Start();
This will keep your UI thread responsive because it's not actually doing anything. The background oracleReaderThread will begin executing in the background.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Bought a House!
Judah Himango
|
|
|
|
|
Wow! That made a huge difference! Thanks so much!
Apoc
|
|
|
|
|
Don't be fooled about speed difference. It will still take just as long (in fact, probably longer on a single-processor machine) to read the data from the database. It's just that the reading won't block your UI thread, which makes everything appear responsive & fast. Users like this. Just beware that multithreading can get very hairy; threads sharing states, threads accessing the same resource, locking & deadlocks, doing UI stuff on background threads, all are difficulties you'll run into if you use threads. I suggest you do some reading[^] on the subject.
|
|
|
|
|
You could also display a wait cursor:
try {
Cursor.Current = Cursor.Wait;
ConnectToOracle();
} finally {
Cursor.Current = Cursor.Default;
}
|
|
|
|
|
I tried that and it said it did not recognize Wait and Default. Am I using an old version of .net? Is this only for 2.0?
Apoc
|
|
|
|
|
No i was a just a bit too quick:
try {
Cursor.Current = Cursors.WaitCursor;
ConnectToOracle();
}
finally {
Cursor.Current = Cursors.Default;
}
Now it should compile
|
|
|
|
|
Ah.. that worked!
Thanks!
Apoc
|
|
|
|
|
Visual Studio's intellisense function would actually have shown you other cursor-options in a listbox. Use it!
modified 12-Sep-18 21:01pm.
|
|
|
|