|
1.
DoEvents() is evil because it adds re-entrancy to your code: pieces of code that were never going to be executed twice at the same time could suddenly run twice. Example:
public void Button_Click(...) {
long-wielding calculation
more long-wielding calculation
}
in the above, the GUI is dead as long as the calculations keep the GUI thread occupied. Inserting one or more DoEvent() calls, causes the message pump to get pumping again; now if you had clicked the same button, the same handler would suddenly run for a second time. And the handler's code was not designed in a thread-safe way as it was never expected to run concurrently. Each run would have its own set of local variables (as they are on stack, there is a stack for each thread), however the object's state, as maintained in the class data, could easily become inconsistent and invalid.
2.
I did not suggest modifying things that look fine; your Invoke (or one of its alternatives), while essential for things to go wrong, is not the cause of the problem.
3.
Jacob Dixon wrote: you have to be trying to make it break for it to throw the error (which is what I'm doing
Trying to break it is part of quality assurance; abuse is a must at that time!
If it were to fail when used normally, now that would really be unacceptable.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
hello everyone
I want to know how to specify the type of a variable declared as Object
better:
I have a variable type object, and I want to test whether this object is string it will make me so and so instrution and if this object and int, and so on.
thank you
Here is a snippet incomplet:
public static string Format(string format, object val,int length)
{
LineDefinition LD;
string var;
if (val.GetType() )
var = string.Format(LD.Format , val).PadRight (LD .Length ,' ');
var = string.Format(LD.Format, val).PadLeft (LD.Length, '0');
return var;
|
|
|
|
|
So you have a type that is an object and you want to determine whether or not it can be cast to a particular type. Is that what you are asking? If so (and if it is possible that the value comes in looking like a string), you can use the TryParse method on a particular type to determine whether or not it is of that type. You need to be careful with this approach because you need to carefully order the sequence of tests; this means that if you have the following:
object o = 10; then o could be a short, an int or a long.
If the variable looks like this example, then you can use the is operator to determine the type, e.g.
if (o is int)
{
}
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
in my case, I will use the second example,
thank you very much for your help, I really need it
|
|
|
|
|
Dear All,
I am workinf on multi-project enviroment. And this is the error I am receiving while building:
A project with an Output type of Class Library cannot be started directly. In order to debug this project, add an executable project to this solution which references the library project. Set the executable project as the startup project.
I have set up the starting project. There are 2 errors, that is why build is not succeeded, I do not want to change anything right now since I am new at the company. I want to run the project anyway. But somehow the executable is not generated.
I need help, what I could do.
|
|
|
|
|
You can't run a DLL. Change your Startup project in your solution to a project that results in a EXE file.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
I know that, what I do not understand is it should generate an executable for a project, I choose that project however somehow it does not generate executable.
|
|
|
|
|
tan_chin wrote: what I do not understand is it should generate an executable for a project
The application type in your projects properties is "Class Library", not a Console or Windows Forms app. You cannot directly execute a Class Library. You either have picked the wrong project type (this does NOT change on it's own!) or you need a second project (Console or Windows Forms app) as a "test bed" to exercize your library.
|
|
|
|
|
tan_chin wrote: There are 2 errors, that is why build is not succeeded, I do not want to change anything right now since I am new at the company.
Why do you not want to fix them - is it somebody elses responsibility to fix an error that you know about? The error is telling you that you can't start a DLL directly; you need an executable to run it. That's what the error is trying to tell you.
Think about it this way. Your DLL exposes methods that need to be called in a certain way using inputs and logic in a particular order. This is what the executable is going to do, so you need to use it to call these methods.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
|
Hi,
I'm trying to read an Excel spreadsheet that contains a variable amount of data, names, address, etc. I will always have columns A-Z, but the number of rows will change. I'm trying to determine the last row in the spreadsheet that contains data. I've tried this code, but it returns a very large number:
public int GetNumberOfRows( )
{
if (excelWorksheet == null)
return (-1);
return (excelWorksheet.Rows.Count);
}
Any help is greatly appreciated.
Glenn
|
|
|
|
|
This might give you some inputs, although not absolutely sure.
My signature "sucks" today
|
|
|
|
|
Good Morning,
I am trying to pass some information to a new page, create a string array, and then use that information in additional code in the application. It seems to work fine until the last step, where the array values seem to disappear (goes null). Somewhere between when the new window closes and I am returned to the original code, I lose the information. I have detailed the process in the code below. Please let me know where I am making my mistake. Thank you in advance for your help, Pat
public frmMain(ArrayList isChecked)
{
InitializeComponent();
this.checkedNames = isChecked;
}
private void buttonWhere_Click(object sender, EventArgs e)
{
for (int iItem = 0; iItem <= listViewColumns.Items.Count - 1; iItem++)
{
colNames.Add(listViewColumns.Items[iItem].SubItems[0].Text);
}
Where w = new Where(colNames);
w.ShowDialog();
foreach (string name in checkedNames)
{
}
}
|
|
|
|
|
Make sure that listViewColumns is not getting set to null in the second page.
My signature "sucks" today
|
|
|
|
|
Abhinav,
Thank you for looking at my dilemma. I am posting the second page code below:
for (int iItem = 0; iItem <= checkedListBox1.CheckedItems.Count - 1; iItem++)
{
string s = (checkedListBox1.CheckedItems[iItem].ToString());
checkedNames.Add(s);
}
frmMain m = new frmMain(checkedNames);
this.Close();
I appreciate any other insight that you might have...Best Regards, Pat
|
|
|
|
|
So, in your frmMain, you have an ArrayList. And a button.
You click the button, and create an instance of your second page, a form called "Where". You then show the form using ShowDialog().
In the form, you merrily add to your ArrayList, and hand it to a new instance of your main form.
Your Where form then closes.
What has happened, is that you new frmMain instance goes out of scope. It is then destroyed. Allongh with it's copy of the ArrayList.
You are then back in your original instance of frmMain, just after your ShowDialog call, and you check the ArrayList. Supprise! It's empty!
Of course it's empty! You added all your data to the local instance you created in the Where form.
What you need to do is when you get back to your original instance, get the arrayList reference from the Where form instance, and copy it to the checkdNames arrayList.
Did you know:
That by counting the rings on a tree trunk, you can tell how many other trees it has slept with.
|
|
|
|
|
The previous answer may not make much sense when you read it. It's is very hard to explain without pictures.
Try this: Use a new sheet of paper every time you use the "new" keyword, and write on it what you have added to it.
Step yourself through your code, and see what happens to your pieces of paper!
Did you know:
That by counting the rings on a tree trunk, you can tell how many other trees it has slept with.
|
|
|
|
|
Griff,
Thank you for taking a minute to explain...yes, I get that. I created a series of stops along the way. That's why I knew exactly where the code went bad. Unfortunately, I do not know what to do next. If I am going to lose the code the second page 2 is deleted (which makes sense), what is the work around? I thought once the arraylist was already created in the constructor, I could "keep it"... . I suppose my knowledge of "reference" is a bit shallow. Since I cannot "keep" the values this way and you seem to fully grasp my predicament, could you please give me a code example that I can use? Thank you...Pat
|
|
|
|
|
OK Griff,
So...now I am in the constructor and the page called 'Where' has not been destroyed yet. So I add code here to make a copy of the Arraylist...but there is a new problem. Now the new 'copy' points to the same memory location as the original. So when the page is deleted, so is the reference for the new copy. Now the question is (I suppose) "How do I copy the old arraylist to a new memory location so that it will survive the destruction of the page and remain?". I think they call it a "deep" copy, and there seems to be a lot of controversy about it. Do you have some code for this?...Thank you, Pat
|
|
|
|
|
You don't need to. As long as there is a single reference to any object, it will not be destroyed - that is one of the major advantages of managed code over unmanaged.
So:
frmMain:
Where myNewForm = new Where();
myNewForm.ShowDialog();
ArrayList myListOfBitsInFrmMain = myNewForm.myArrayListOfBits;
Where:
myArrayListOfBits = new ArrayList();
myArrayListOfBits.Add("Item1");
myArrayListOfBits.Add("Item2");
then "myListOfBitsInFrmMain" contains a reference to an ArrayList with two items. Unless "myListOfBitsInFrmMain" goes out of scope, or your frmMain instance is destroyed, the ArrayList will be available.
Did you know:
That by counting the rings on a tree trunk, you can tell how many other trees it has slept with.
|
|
|
|
|
Griff,
Thank for for your detailed explanation and example. What's even better is that I now have a better understanding of how the arrays work! I have changed the code accordingly and it works perfect. I have marked this as the correct answer. Best Regards, Pat
|
|
|
|
|
Hello,
I need to parse plain Win32 DLL/Exe and need to get all imports and exports from it and to show it on console or GUI(say Win Forms). Is it possible to parse Win32 DLL/Exe in C#.NET, read its export table,import table and get managed types from it. As its unmanaged PE(.NET doesn't allows you to convert unmanaged PE files to managed .NET assemblies, only it generates COM managed assemblies).
So how to parse export and import tables of PE files and take all methods(signatures from it) in managed form.(e.g if char* as argument, it should display as IntPtr)
Regards
Usman
|
|
|
|
|
IMO that is impossible. A native code DLL or EXE file (which uses PE format) normally contains an import and an export table, containing the names of the functions; there is no information about the parameters nor the return type, except maybe, those are to some extent encoded in the C++ name mangling. The mangling is not complete; only some info is available.
Furthermore, a lot of Windows DLLs export functions by number ("ordinal number") rather than by name.
Next, you need to know what the calling convention has to be (CDecl, StdCall, ...). That information is not present, unless you start studying the assembly instructions.
And finally, when using P/Invoka to call a native function from a managed language, one can, and often does, create several prototypes, all mapping to the same function, but taking different parameter types. A typical example would be SendMessage().
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
glitteringsound wrote: I need to parse plain Win32 DLL/Exe and need to get all imports and exports from it and to show it on console or GUI(say Win Forms). Is it possible to parse Win32 DLL/Exe in C#.NET, read its export table,import table and get managed types from it. As its unmanaged PE(.NET doesn't allows you to convert unmanaged PE files to managed .NET assemblies, only it generates COM managed assemblies).
You need to understand, EXACTLY, the Windows PE format. From there, you can write your own library that can parse the file, byte by byte. I've done it myself. No, you can't have the code.
You can start by reading this article[^] and the article it links to. There is also a PDF file that I found that goes into more detail. You can get it from here[^].
Now, you can only get the function names of the import and export tables. There is no information at all inside a PE file that contains anything about the parameters passed or expected by those functions.
|
|
|
|
|
hi, When adding items to a listview, I want the last added item on top instead of bottom. How can I achieve that? Thanks in advance
By the way, when I use sorting property (ascending or descending), everything mess up
modified on Sunday, May 23, 2010 10:18 AM
|
|
|
|
|