|
The textbox aren't really designed for holding 20MB of text.
Try opening the file in notepad and see how much time it take.
A RichTextBox might be a better choice in your case.
|
|
|
|
|
.jpg wrote: The textbox aren't really designed for holding 20MB of text
He he, don't tell me .
the rich textbox does give a slight improvement .
|
|
|
|
|
I'm not too sure about putting text into a textbox quicker, but if you definately know that every 2nd character is a letter, then using
text[i] = (char)((int)text[i] - 32);
is quicker than using
text[i] = char.ToUpper(text[i]);
|
|
|
|
|
if(char.IsLetter(text[i])){
text[i] = (char)((int)text[i] - 32);
}
gained me 1 second thanks
(this is actually kinda fun , I learned a lot here... )
|
|
|
|
|
You could even call your progress bar update fewer times than you are, with a 20 meg file you're currently calling the progress bar update more than 20,000 times.
If this takes 10 secs to go through the for loop, that's 2000 progress bar updates per second, bit of overkill there.
|
|
|
|
|
Unfortunately this will only work for ANSI characters, so you're actually introducing a bug in order to gain a few ms...
Not a good deal IMHO.
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
It's not introducing a bug, if you had read the original thread from a few days ago you'd realise that this is what the OP wanted - 'convert "aabb" to "aAbB" and set it to the textbox as quickly as possible'.
Thanks.
|
|
|
|
|
Ok, if it's really just A's and B's then it'll work of course.
I guess I'm already going on auto when seeing someone performing integer maths on characters
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
I am not surprised it is faster as ToUpper actually converts to upper case.
Subtracting 32 works in a limited subset of letters (the A-Z range and a few others), and it ignores cultural settings. Sure it might be fine enough for a "just for the fun of it" project like this, but unfortunately people end up beleiving they actually can convert using code like this in real projects as well.
|
|
|
|
|
Instead of using
txtbox_result.Text = new string(text);
Do this
txtbox_result.AppendText(new string(text));
|
|
|
|
|
tnx, good idea, but didn't help.
|
|
|
|
|
I can process a 20 meg file and display it with appendtext in 4 seconds.
|
|
|
|
|
mine is, with ngen and Highest priority thread about 16 seconds. Maybe you have more memory and faster cpu? (Centrino 2,13GHz, 2Gb memory)
|
|
|
|
|
Here's my code.
I'm using a standard textbox.
textBox2.Clear();
DateTime dt = DateTime.Now;
StreamReader sr = new StreamReader(@"C:\test\test.txt");
char[] c = sr.ReadToEnd().ToCharArray();
progressBar1.Maximum = c.Length;
for (int i = 0; i < c.Length; i += 2)
{
if ((int)c[i] >= 97 && (int)c[i] <= 122)
c[i] = (char)((int)c[i] - 32);
if (i % 10000 == 0)
progressBar1.Value = i;
}
textBox2.AppendText(new string(c));
MessageBox.Show((DateTime.Now.Ticks - dt.Ticks).ToString());
Note that a textbox does only store 32k of text, but if your assignment says you just have to fill a textbox, then you are only doing what it says...
|
|
|
|
|
thanks, i'll try this tomorrow. Last day for submitting our tries .
Maybe I'll post in the lounge next week how I did (or we did )
|
|
|
|
|
I have PDF documents and I must print them directly from a C# program.
I must do it from my C# program under .NET 1.1.
Can somebody help me ?
Thank you in advance,
Patrick Meinguet
|
|
|
|
|
You can always use the Process object. The code would be something like:
System.Diagnostics.Process p = new System.Diagnostics.Process;
p.StartInfo.Verb = "print";
p.StartInfo.FileName = "putthefilenamehere";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = true;
p.Start();
System.Threading.Thread.Sleep(5000);
p.Close();
Hope that helps.
Ben
|
|
|
|
|
Hi All
I am a new to C# and to programming . My first job. I want to get some things right. The coding that i am doing will go in for a code review and it will be my first one.
The problem is that i am creating a control at run time and registering an event to take care of click event
like belwo
GridVoucher.Click += new GridClickEventHandler(GridVoucher_Click);
i may want to dispose off the control also !!
Do I unregister this event before I dispose of the code (I think i should)
If so how ? I know I am suppose dto use the -= operator but how?
I am confused
Can somebody help ?
Thanks
Romi
|
|
|
|
|
GridVoucher.Click -= new GridClickEventHandler(GridVoucher_Click);
|
|
|
|
|
You don't have to worry about.. deallocating the memory.
the GC will do it for your self.
otherwise if u still want to do it.. then u don't need to unregister the event
and if u still want to unregister the event then the -= is the operator to do that.
|
|
|
|
|
Thanks Guys for your prompt reply
Just one doubt remains...??!!!
Now i dispose off the control which was subscribing the event. But if the event it self isnt unregistered first will that result in a reference to this event still remaining in memory even though the subscriber has been de-allocated
Ot will the GC take care of that too...
Just thinking out aloud...
Romi
|
|
|
|
|
Deallocating memory and unregistering event handlers are not the same thing. The proper way to handle this is unregister the event handler inside your own Dispose method, which involves properly implementing the Dispose pattern.
-----------------------------
In just two days, tomorrow will be yesterday.
|
|
|
|
|
The proper way to do this is to place the code to unregister the event handler in the Dispose method.
I'm going to assume that GridVoucher is not a custom control, user control, or form, and is, instead, a standard UI control (like a listbox). That being said, the form (or user control) that contains this control will have a Dispose method (if you are using VS2005, look in the .Designer.cs file for it). This method should look something like this:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} You need to modify this method to look similar to this:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
if (disposing)
{
if (GridVoucher != null)
{
GridVoucher.Click -= GridVoucher_Click;
}
}
base.Dispose(disposing);
} What this does is tell the Garbage Collector (GC) that when the form (or user control) is disposed (and not running as part of a finalizer, which is another part of the garbage collection process) that it also needs to remove the event handler if the GridVoucher object exists and is not null.
-----------------------------
In just two days, tomorrow will be yesterday.
|
|
|
|
|
|
Rome` wrote: the designer code will be regenerated
If you are using VS2005, it is safe to modify the Dispose method in the .Designer.cs file. Otherwise, you are right and may have an issue (it's been too long since I've used the earlier versions so I'm not 100% sure if they will overwrite the Dispose method when regenerating the designer generated code).
Rome` wrote: GridVoucher.Click -= new (GridVoucher_Click); be enough
If you double check the code in my previous post, you will see that I am actually calling GridVoucher.Click -= GridVoucher_Click; . There is no new call. Technically, the GridVoucher.Click -= new(GridVoucher_Click); is creating a new event handler delegate with the same signature as the previous one and then unregistering it, which ultimately causes both to be unregistered. It's a little bit quirky that you can do this, but it does work. However, the better approach is to use the GridVoucher.Click -= GridVoucher_Click; syntax as this prevents an additional object from being created. Remember, this is all happening as the class is being disposed, so you want to make sure things happen as quickly and efficiently as possible. You should avoid creating new objects inside the Dispose whenever possible.
-----------------------------
In just two days, tomorrow will be yesterday.
|
|
|
|