|
You have to make sure that you are looking for the correct window title. The search is done by that parameter, case sensitive. In my example, I left the title to default "Form1", change that to the title of the VC++ window.
Scott P
"Run for your life from any man who tells you that money is evil. That sentence is the leper's bell of an approaching looter." --Ayn Rand
|
|
|
|
|
lol, thanks, that is working, but if I take that handle and try to create a Form or Control with the FromHandle method, it will still result in null, although GetWindowText is working.
IntPtr handle = FindWindow(null, "windowtitle");
Form f = Form.FromHandle(handle);
Control c = Control.FromHandle(handle);
string text = "";
GetWindowText(handle, text, 10);
MessageBox.Show(text);
So in this case both f and c are null, but the MessageBox will show my dialogtitle.
My theory is that the code can't convert a Dialog or a Control from a VC++ form/control to a .Net form/control, but I'm not sure about that.
thanks !
(and sorry to be so difficult )
|
|
|
|
|
Hello everybody,
in a DBF Database the strings are written in a given way.
If i read out the strings in C++ i get for the €-Char the Integer-Value -128
In C# i read out the string of the DBase-Table via the ODBC-Connection.
There the Integer-Value is 199 (and does not belong to the €-Char)...
if i convert the character set with Encoding.GetEncoding(858)
i get the right €-Char but has also a integer-value of 8364
How can i convert the values to obtain the -128?
Big thanks in advance !!
|
|
|
|
|
The Euro symbol wasn't part of the original ASCII set, but this[^] page says after installing a patch ASCII 128 becomes the Euro sign.
8364, on the other hand, is the Unicode value for the Euro sign and is safer to use.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
Hi master,
I got this error message when initialize matrix with so large number MxN
An unhandled exception of type 'System.StackOverflowException' occurred in [project name].exe
I dont know how to pass this error, anyone can help me please? This is my code:
<br />
class image<br />
{<br />
<br />
<br />
public void zoning()<br />
{<br />
int Max = 0;<br />
for (int i = 1; i < M - 1; i++)<br />
for (int j = 1; j < N - 1; j++)<br />
if (Img_In_Process[i, j] == -1)<br />
{<br />
Max++;<br />
Point_Zone(i, j);<br />
}<br />
}<br />
<br />
private void Point_Zone(int i, int j)<br />
{<br />
Img_In_Process[i, j] = Max;<br />
if ((i - 1 >= 0) && (Img_In_Process[i - 1, j] == -1)) Point_Zone(i - 1, j);<br />
if ((j - 1 >= 0) && (Img_In_Process[i, j - 1] == -1)) Point_Zone(i, j - 1);<br />
if ((i + 1 < M) && (Img_In_Process[i + 1, j] == -1)) Point_Zone(i + 1, j);<br />
if ((j + 1 < N) && (Img_In_Process[i, j + 1] == -1)) Point_Zone(i, j + 1);<br />
}<br />
}
|
|
|
|
|
You are recursively calling Point_Zone too many times and running out of stack space.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
As the other poster said, you are going too deep recursively.
Now you have 2 options:
a. Rewrite the algorithm so it does not need recursion, in other words iteratively.
b. Use editbin to increase the stack space if this is indeed a borderline case and an attempt at (a) failed.
|
|
|
|
|
Thanks for your reply, leppie.
I can not change my algorithm so I must increase stack space,
But I dont know how to increase the stack space, please help me!!
|
|
|
|
|
cuongmits wrote: I can not change my algorithm so I must increase stack space,
But I dont know how to increase the stack space, please help me!!
He already did, see his reply.
b. Use editbin to increase the stack space if this is indeed a borderline case and an attempt at (a) failed.
I would look into ways of changing the algorithm first though.
/* I can C */
// or !C
Yusuf
|
|
|
|
|
Hi Yusuf,
Yes, I read his reply already, but I dont know exactly how to use EDITBIN? Where is it??? Can you explain where to find that? Is it command or function of MS VS C#?
Best regards.
|
|
|
|
|
check MSDN ^
/* I can C */
// or !C
Yusuf
|
|
|
|
|
Hello.. im alittle new when it comes to handling threads and all the crap.. and i would really appreciate if someone would be able to give me some guidance tips..
i have tried to build a small search program who runs up of my entire hard drives (for now it was limited to windows directory)and to give me the strings that matches to the search box..
well it works perfectly.. though it takes a while to search because i dont know how to use multi threading..
i have tried reading articles but i always get stuck at some point... for now ive managed to create one single thread and when im trying to send another one .. they dont synchronize it just multiply the result by 2...can please someone direct me to the answer and help me abit.. wide explanations will be awesome
here's the code
the main procedure:
<br />
namespace SearchFile<br />
{<br />
public struct directors<br />
{<br />
public DirectoryInfo Dir;<br />
public bool processed;<br />
}<br />
public partial class Form1 : Form<br />
{<br />
<br />
directors direct;<br />
public string location = "";<br />
public delegate void invokegetdirecotrs(directors dr);<br />
public Form1()<br />
{<br />
InitializeComponent();<br />
}<br />
public void getDirectors(directors dr)<br />
{<br />
<br />
if (this.InvokeRequired)<br />
{<br />
invokegetdirecotrs inv = new invokegetdirecotrs(this.getDirectors);<br />
this.Invoke(inv, new object[] { dr });<br />
}<br />
<br />
else if( dr.processed == false)<br />
{<br />
dr.processed = true;<br />
int i = 0;<br />
Array Sub_Dir;<br />
FileInfo[] fi = dr.Dir.GetFiles();<br />
string comparest;<br />
Sub_Dir = dr.Dir.GetDirectories();<br />
if (Sub_Dir.Length > 0)<br />
{<br />
for (i = 0; i < fi.Length; i++)<br />
{<br />
comparest = fi[i].Name.ToString();<br />
for (int j = 0; j < comparest.Length - location.Length + 1; j++)<br />
{<br />
if (location == comparest.Substring(j, location.Length))<br />
{<br />
j = comparest.Length;<br />
listView1.Items.Add(fi[i].FullName.ToString());<br />
}<br />
}<br />
<br />
}<br />
foreach (DirectoryInfo d in Sub_Dir)<br />
{<br />
DirectoryInfo di = new DirectoryInfo(d.FullName.ToString());<br />
direct.Dir = di;<br />
getDirectors(direct);<br />
}<br />
<br />
}<br />
else<br />
{<br />
fi = dr.Dir.GetFiles();<br />
for (i = 0; i < fi.Length; i++)<br />
{<br />
comparest = fi[i].Name.ToString();<br />
for (int j = 0; j < comparest.Length - location.Length + 1; j++)<br />
{<br />
if (location == comparest.Substring(j, location.Length))<br />
{<br />
listView1.Items.Add(fi[i].FullName.ToString());<br />
j = comparest.Length;<br />
}<br />
}<br />
<br />
}<br />
<br />
}<br />
}<br />
}<br />
and the button click
<br />
private void button1_Click(object sender, EventArgs e)<br />
{<br />
<br />
listView1.Items.Clear();<br />
location = textBox1.Text;<br />
if (location != "")<br />
{<br />
DirectoryInfo dir = new DirectoryInfo(@"c:\divx");<br />
directors dr;<br />
dr.Dir = dir;<br />
dr.processed = false;<br />
ThreadStart starter = delegate<br />
{<br />
getDirectors(dr);<br />
};<br />
new Thread(starter).Start();<br />
<br />
ThreadStart starter1 = delegate<br />
{<br />
getDirectors(dr);<br />
};<br />
new Thread(starter1).Start();<br />
<br />
<br />
}<br />
}<br />
i appreciate your help!
the lost guy ;[
|
|
|
|
|
Gosh this code is a mess! I'm not sure I know where to start in helping you to work through this but here goes:
if (this.InvokeRequired)<br />
{<br />
invokegetdirecotrs inv = new invokegetdirecotrs(this.getDirectors);<br />
this.Invoke(inv, new object[] { dr });<br />
}
Whatever you are doing here it is very wrong. I think you've misunderstood the point of the Invoke method. It would serve you well to go and look up the documentation to this particular method and read through the description and pay extra attention to the examples given. In a nutshell, you use Invoke to marshall a call back to the UI thread - this is the only thread where you will be able to update the UI (In your case fill a matching file into the ListView).
On the subject of filling the listview you should have a method which encapsulates just this functionality. This method will itself take care of the cross-threadedness of your app.
private delegate void AddItemToListViewDelegate(string item);<br />
<br />
<pre>private void AddItemToListView(string item)<br />
{<br />
if(this.InvokeRequired)<br />
{<br />
this.Invoke(new AddItemToListViewDelegate(this.AddItemToListView),item);<br />
return;<br />
}<br />
this.listView.Items.Add(item);<br />
}</pre><br />
<br />
Now you can call this method from any thread and it will take care of marshalling back to the UI. Attantion to the return keyword, this stops execution continuing on the separate thread - this is one of the specific places you've gone wrong in your code.<br />
<br />
As for the rest of the code, you've massively over-complicated it. You dont need the structs and the wierd "processed" property, and you definately dont have to check the filename one char at a time like this (hint: string has a <code>Contains method):
comparest = fi[i].Name.ToString();<br />
for (int j = 0; j < comparest.Length - location.Length + 1; j++)<br />
{<br />
if (location == comparest.Substring(j, location.Length))<br />
{<br />
listView1.Items.Add(fi[i].FullName.ToString());<br />
j = comparest.Length;<br />
}<br />
}
All you really need is a recursive function that does the looking for the search phrase:
private void SearchRecursive(DirectoryInfo dir, string search)
{
foreach(FileInfo fi in dir.GetFiles())
{
if(fi.FileName.Contains(search))
AddItemToListView(fi.FileName);
}
foreach(DirectoryInfo di in dir.GetDirectories())
{
SearchRecursive(di,search);
}
}
Finally, why you fire off 2 threads in the button click I can only imagine, but suffice it to say you only need one and it should call SearchRecursive with the starting directory (new DirectoryInfo("c:\divx") ) and the contents of your search textbox (textBox1.Text ).
Hope that helps.
|
|
|
|
|
First Of all thanks for correcting me.. I made this program without knowing the contain function i donno y i havent looked that out ..
in addition.. the invoke key i have used was taken out from the mdsn site and i didnt really knew what the hell to do with it.. thanks for clearing that out
the program now works perfectly thank you !!
BUT
i wanted the process to work faster.. by adding more threads to the search program (where each thread looks at some other directory)thats what i meant by synchronizing threads and working with multi threads.. how can i do that?? consider your code as my base program code
and i can ask another question..
Multi threads and threadpool..
whats the difference between them??
is threadpool just a number of multi threads function?
thank you so much!
|
|
|
|
|
Multi threading isn't a simple solution to all your performance problems. You're accessing a disk here, and looping through every file and directory. Disk access is slow compared to CPU speeds. if you spawn multiple threads, all that's going to happen is they'll each be fighting over the disk because the disk won't be able to keep up with all the requests from the CPU.
It's like copying files. Try copying 2 large files separately, but start them at the same time. See how long it takes. Now try copying them one at a time and wait for the first to finish before you start the second, it'll take roughly the same amount of time in total, because by doing them both at the same all that happens is the CPU has to wait for the disk to be ready.
There is no easy way to speed up a full disk search, you've just got to sit it out. I suppose what you can do is have 1 thread for getting all the data from the disk, and a second to process it all, so thread 1 can carry on reading the disk while thread 2 is processing the data. But other than that, multi threading is not going to help you unless you have multiple disks, then you can target 1 thread at each disk.
(The other way to do things is to index the disk, and hold the index in memory. You would have to have a service or something to monitor the disk for changes. I assume this is how things like google desktop search works.)
Simon
|
|
|
|
|
Ok Got it thanks!
Can you please though give me an example of how to work with a multi threads situation??
this is not necessarily have to do with my program, i just want to go to know that feature cause i really cant seem to understand how to synchronize between threads..
And threadpool<>multi threads <-- what's the difference??
|
|
|
|
|
shinboxe wrote: threadpool<>multi threads <-- what's the difference??
Think of the thread pool as a pot of ready made threads available for you to use. Threads are relatively costly to create and manage, so if you just want to do some quick and simple actions on separate threads, you can request some threads from the pool, use them, then give them back when your finished. The thread pool will give you threads to meet your needs but when you've finished and you hand them back to the pool, it might keep them around and reuse them for other applications who use the pool rather than destroying and creating new threads every time someone needs them.
The disadvantage is that you lose some control over exactly how many threads you create and various other details like thread priority and stuff. You just tell the pool what jobs you want done with ThreadPool.QueueUserWorkItem(), and the pool will manage the threads for you.
There are lots of different ways to work with Threads, and it's not a simple topic, so I would suggest you get a good .Net book. "CLR via C#" and "Pro C# 2008 & the .Net 3.5 platform" both have good chapters on async operations and thread synchronisation with .Net
Simon
|
|
|
|
|
|
Hi,
How to know that an internet connection is alive at some instant of time?
I know that there are methods like InternetGetConnectedState and InternetCheckConnection which tell that whether a internet connection is alive and whether a particualr url is reachable..
But I would know this when I run the application..
But How to write a simple application which dynamically knows that the internet connection has just been estabilished? Or a particular url is reachable now (just like hooking?)
|
|
|
|
|
To check something is reachable, you could attempt to ping it.
He who makes a beast out of himself gets rid of the pain of being a man
|
|
|
|
|
I already know half the solution to this problem, as I told you that there are methods in 'wininet.dll' to know that internet connection is available, but I want to create an application which identifies the connection dynamically..
What I mean is that when the user plugs in his modem or anything like this which connects his system to internet, I want this application to write a log somewhere or maybe pop up a screen..
how do I do this?
|
|
|
|
|
You could always write an application that runs at Startup, and attempts the connection every second or so.
|
|
|
|
|
Did you mean to say I write a windows Service for that?
Well that would be very heavy performance wise..
Can you suggest something else please?
|
|
|
|
|
ptr2void wrote: Did you mean to say I write a windows Service for that?
Nope, as one of your requirements was for some form of UI. Just write your application to use a tray icon and have it run as part of the Startup process (i.e. if it's in the Startup directory in your start menu, it automatically gets started when the user logs in).
|
|
|
|
|
If I remember, there's a way to check if the internet connection is active through WMI. The failing of this method I remember was that you don't know if there's an internet connection but that the LAN connection is active. It is assumed that if the LAN is active there is an internet connection.
"Every time Lotus Notes starts up, somewhere a puppy, a kitten, a lamb, and a baby seal are killed. Lotus Notes is a conspiracy by the forces of Satan to drive us over the brink into madness. The CRC-32 for each file in the installation includes the numbers 666." Gary Wheeler
"You're an idiot." John Simmons, THE Outlaw programmer
"I realised that all of my best anecdotes started with "So there we were, pissed". Pete O'Hanlon
|
|
|
|