|
Well, if you're using Application.DoEvents, you're doing something very wrong. Even more so with repainting individual controls or images. DoEvents doesn't go back to your apps normal message pump to process any pending messages, like WM_PAINT. It processes them in place, in it's own loop until the message queue is empty, essentially putting your app "on hold".
DON'T USE THIS, EVER. It just causes problems, like what you're dealing with.
|
|
|
|
|
That seems like sensible advice, thanks. I have to turn the program inside out to use another tactic,so it will take a while to see if that fixes it; now reading about BackgroundWorker...
|
|
|
|
|
Member 12748783 wrote: As you can see, none of the trace refers to my code, but to System.Drawing dll. It is referring to one of your PictureBox es. Remove them and the error goes away.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
LOL. I suppose that would work.
|
|
|
|
|
Would that exception-handler be part of the OnPaint-method?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Dave is absolutely right: if you are using DoEvents there is a problem - and since your stack trace is talking about the fault happening in Paint event handlers, then if you are using DoEvents in that, then there is a very, very good chance that you are blowing the stack to pieces. DoEvents processes messages in the loop and dispatches them - so it allows the system to handle Paint events while it does something long and complex. If you start handling new Paint events within the Paint handler, there is a good chance that the Paint code caused a Paint event, and the DoEvents message loop processing is just stacking up calls - effectively recursing the Paint handler and using all the stack space.
Paint handlers should be as short and snappy as possible - any long processing at all in there will slow the whole app UI experience!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
The vote seems to be unanimous. I'll recode it to avoid DoEvents and try to squish all the graphics updates together and see if that helps.
This is a long running (weeks, months) simulation, and updating a form is mostly an afterthought. The prior version was a console application and I thought, hey, wouldn't it be nice to be able to see what it's doing while it's running, rather than just analyzing the logs and watching the video afterwards? And my C# in Easy Steps book says DoEvents is the easiest way to do that.
Anyway, thanks, all, for the advice. Might as well close this one, because it will be a different program after the changes, lol.
|
|
|
|
|
You're welcome!
Member 12748783 wrote: my C# in Easy Steps book says DoEvents is the easiest way to do that.
"Easy" doesn't always mean "best"!
The "easiest" way to start driving is to steal a car and put your foot down - doesn't mean it's the best way to get to work every day!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Well poop.
For debugging purposes, I made minimal changes to see if y'all's suggestions helped to isolate the issue. I commented out the DoEvents, commented out the individual Update()s for text and picturebox elements, and relied on one this.Update(), as quoted in the original post. The exact same thing happens. It crashes on this.Update after this.Invalidate with the same message and the same stack trace. Stepping through the program on Debug I can see that it crashes the SECOND time it hits this.Update(). That is consistent. It will refresh the form once, but chokes the second time.
I also ran it for a while retaining the multiple individual Update()s and with the this.Update() commented out along with the DoEvents line. Other than locking the form and failing to redraw some text (as one might expect), it hummed along perfectly. I could not minimize the form, but turning the monitor off/on had no ill effects. Since this is a long running simulation and the only important controls on the form are START and STOP buttons, that was an improvement. (There are plenty of other ways to stop it!)
So I still have the same issue without DoEvents. Any thoughts?
|
|
|
|
|
Hi I need help with code to get the Files in directories. The below code get all the drives, directories and subdirectories but I'm having issue getting the files and displaying them in a Listview. I'd appreciate your help.
foreach (string drive in Directory.GetLogicalDrives())
{
TreeViewItem item = new TreeViewItem();
item.Header = drive;
item.Tag = drive;
item.FontWeight = FontWeights.Normal;
item.Items.Add(dummyNode);
item.Expanded += folder_Expanded;
TreeViewItemProps.SetIsRootLevel(item, true);
treeView1.Items.Add(item);
}
void folder_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = (TreeViewItem)sender;
if (item.Items.Count == 1 && item.Items[0] == dummyNode)
{
item.Items.Clear();
try
{
foreach (string dir in Directory.GetDirectories(item.Tag.ToString()))
{
TreeViewItem subitem = new TreeViewItem();
subitem.Header = new DirectoryInfo(dir).Name;
subitem.Tag = dir;
subitem.FontWeight = FontWeights.Normal;
subitem.Items.Add(dummyNode);
subitem.Expanded += folder_Expanded;
item.Items.Add(subitem);
}
}
catch (Exception) { }
}
}
|
|
|
|
|
Rather than showing us the code that works, how about showing us the code that doesn't work, and explaining what the problem is?
Also, you need to format your code properly. If you don't get the "paste as" prompt when you paste it, then select the entire code block and click the "code" button on the toolbar. Or surround the entire block with <pre>...</pre> tags.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard thank you. I'll try to get better at this as this is my firs time. Below is the code I use to get the files, but It's creating folders rather than adding the files to the directories: Bottomline, the previous code gives me directories and subs but I can't seem to write the code that add the files.
void file_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = (TreeViewItem)sender;
//if (item.Items.Count == 1 && item.Items[0] == dummyNode)
{
//item.Items.Clear();
try
{
foreach (string file in Directory.GetFiles(item.Tag.ToString()))
{
TreeViewItem fileitem = new TreeViewItem();
fileitem.Header = new DirectoryInfo(file).Name;
fileitem.Tag = file;
fileitem.FontWeight = FontWeights.Normal;
fileitem.Items.Add(dummyNode);
fileitem.Expanded += file_Expanded;
item.Items.Add(fileitem);
}
}
catch (Exception) { }
}
|
|
|
|
|
Is this event handler actually called from anywhere? The only reference I can see is from the items that it creates, which would suggest it never runs.
If you want to add the files to the tree, then you probably want to do so from the folder_Expanded handler:
void folder_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = (TreeViewItem)sender;
if (item.Items.Count == 1 && item.Items[0] == dummyNode)
{
item.Items.Clear();
try
{
string path = item.Tag.ToString();
foreach (string dir in Directory.GetDirectories(path))
{
TreeViewItem subitem = new TreeViewItem();
subitem.Header = new DirectoryInfo(dir).Name;
subitem.Tag = dir;
subitem.FontWeight = FontWeights.Normal;
subitem.Items.Add(dummyNode);
subitem.Expanded += folder_Expanded;
item.Items.Add(subitem);
}
foreach (string file in Directory.GetFiles(path))
{
TreeViewItem fileitem = new TreeViewItem();
fileitem.Header = new FileInfo(file).Name;
fileitem.Tag = file;
fileitem.FontWeight = FontWeights.Normal;
item.Items.Add(fileitem);
}
}
catch (Exception) { }
}
}
If you want to add the files to a different control when a folder node is selected, then you'll need to do so in the SelectedItemChanged[^] event instead.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard, thanks for your reply. Interestingly about 1 am I rewrote my code similar to what you suggested and it worked. I added my files to the listview and they appear there. The only thing that baffles me is that now that the files are listed where I want them. I can't select any of them. I've made sure that the listview is enabled. Any ideas I's appreciate it. Here's the code I used, but your code seems much cleaner. Later today I will try your suggestion.
foreach (string dir in Directory.GetDirectories(item.Tag.ToString()))
{
TreeViewItem subitem = new TreeViewItem();
subitem.Header = new DirectoryInfo(dir).Name;
subitem.Tag = dir;
subitem.FontWeight = FontWeights.Normal;
subitem.Items.Add(dummyNode);
subitem.Expanded += folder_Expanded;
item.Items.Add(subitem);
}
foreach (string file in Directory.GetFiles(item.Tag.ToString()))
{
TreeViewItem fileitem = new TreeViewItem();
fileitem.Header = new DirectoryInfo(file).Name;
fileitem.Tag = file;
fileitem.FontWeight = FontWeights.Normal;
if (file.Contains(".csv"))
{
listView1.Items.Add(fileitem);
}
|
|
|
|
|
Maybe it's because you're adding a TreeViewItem to a ListView . You should be adding a ListViewItem[^] instead.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard,
Thank you for your feedback. The code you gave works fine. However, I'm not clear on your recent message regarding ListViewItem.
My Drives, Folders and subfolders appear in the Treeview (Left Panel) and I want the Files to appear in the ListView (Right Panel). So I'm not clear what you are suggesting. In the code below I try what I think you are saying but Header is not contained in ListViewItem. Can you explain further?
void folder_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = (TreeViewItem)sender;
if (item.Items.Count == 1 && item.Items[0] == dummyNode)
{
item.Items.Clear();
try
{
string path = item.Tag.ToString();
txtPath.Text = path;
listView1.Items.Clear();
foreach (string dir in Directory.GetDirectories(path))
{
TreeViewItem subitem = new TreeViewItem();
subitem.Header = new DirectoryInfo(dir).Name;
subitem.Tag = dir;
subitem.FontWeight = FontWeights.Normal;
subitem.Items.Add(dummyNode);
subitem.Expanded += folder_Expanded;
item.Items.Add(subitem);
}
foreach (string file in Directory.GetFiles(path))
{
ListViewItem fileitem = new ListViewItem();
fileitem.Header = new DirectoryInfo(file).Name;
fileitem.Tag = file;
fileitem.FontWeight = FontWeights.Normal;
listView1.Items.Add(fileitem);
}
|
|
|
|
|
The ListViewItem[^] class doesn't contain a Header property, because it wouldn't make sense in a ListView .
You specify the content of the item using the Content property. The ListView[^] documentation has an example of how you set up a template to display the items.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard, thank you very much. Using ListView resolved my issue. You've been a tremendous help!
|
|
|
|
|
i have created a crystal report with access db in c#. but when i run this report its want login information. how can i solve this problem?
|
|
|
|
|
What login information? Database credentials? Or other licensing needs?
Member 13417072 wrote: i have created a crystal report with access db in c# Then why you don't know how to solve where you have requested the credentials?
The thing is, you would require to provide the database credentials, so make sure you know what credentials you used while creating the report so that the same can be used during deployment and rest. If you do not know what credentials you used, you would need to recreate the report with the credentials that can be used on the server for access.
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
Hey guys i would like to know if it's better to start developing using java or c++?
I m still a beginner by the way.
|
|
|
|
|
A.Mr.Nice.Guy wrote: I m still a beginner by the way. That is glaringly obvious - you posted this in the C# forum.
Your choice of language should depend on the job/work you expect to do and you will no longer be able to choose just one language/tool set.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Depends on the application: an android app wouldn't be in C++, it would be in Java, or C# via Xamarin.
An iOS app would be Objective C or C# via Xamarin.
A PC desktop app could be C++, C, VB, C#, possibly Java but I wouldn't recommend it, F#, or any of countless others.
Me? I'd suggest starting to learn with C# rather than either of C++ or Java - it's a cleaner, simpler solution than C++ and has a much better IDE than Java. But it's your choice, not ours!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I agree with OriginalGriff. Think of language choice as being tools in your toolbox. As a beginner, you have limited tools, so learn the tool that will do what you are wanting to do the most of. A screwdriver handle can still drive a nail, but think of how much more efficient a hammer is.
|
|
|
|
|