|
vamsimohan21 wrote: I am sorry that i am in situation that I would not be able to expose the code,
I am sorry that I am in situation that I would not be able to answer the question.
(You can't honestly expect anyone to solve your coding issue without seeing the code, do you?)
|
|
|
|
|
Hi All,
i'm trying to implement animation in an app. The frame rate of the animation needs to be variable. To implement this, i have a thread which sleeps for 1/fps seconds, and when it wakes it invalidates the window. Then, the onpaint handler draws the next frame.
Whilst this approach works ok at low frame rates, when things speed up, the animation gets choppy (due to the way in which the message queue is processed).
Is there a better approach? I want to be able to draw at reasonably precise times. Would DirectDraw help? i've never looked at directx, but would be prepared to if it offered a solution to my problem.
Thanks
slip
|
|
|
|
|
Hi,
you may find some suggestions in my timer article...
|
|
|
|
|
Thanks, but I understand why the animation is jerky - the kernels scheduler runs on a similar timer to what you describe.
I'm just wondering how other apps which animate do it so smoothly - eg windows media player.
|
|
|
|
|
Hi,
I dont know how WMP does what it does. This comes to mind:
- use the right kind of timer
- use double-buffering
- make sure everything you need is in memory before you need it
- precalculate the next frame, so the only real-time thing to do is show it
- possibly work with thread priorities (not recommended if you are not familiar with it).
|
|
|
|
|
Hi Slip
I have recently worked on a solution that is similar to your needs. I used threads that animated a user control containing other controls, in fact I had multiple user controls being animated on the same form, with different threads.
I used delegates to access a number of variables on the form from my threads.
Also in the form I declared a volatile integer like this:-
private volatile int componentOnPaint
And a public method which will be used by a delegate to return the above value.
Then in your override method for OnPaint in the form, increment the componentOnPaint integer, this way you know how many times the form has been re-painted.
Before your thread has invalidated the form get the componentOnPaint value, invalidate the form and then sleep for a short time using Thread.Sleep(30) (this allows the thread to be re-painted). At the next line of execution check the componentOnPaint value again, if it is greater than before, then continue. Otherwise loop and sleep again, until the value is greater and the form is repainted. Then you would use Thread.Sleep again for a fixed time depending on the animations frame length.
To make the animation smoother, use another delegate to get the delay time (milliseconds) required in between animation cycles. Use DateTime.Now to get the time before you invalidated your form, and use DateTime.Now to get the time after componentOnPaint was greater.
Subtract the first value from last eg...
TimeSpan drawTime = AnimateLastStart - AnimateLastDrawn;
Then reduce your delay time by the time it took to refresh your form... ie...
<br />
Thread.Sleep(standardTime-drawTime.Milliseconds)
This worked for me, using volatile earlier means the variable can act as a semaphore accessible from any thread (hence volatile), so you know if the form has been drawn and you shouldn't miss any frames. The time manipulation should just make your animation smoother.
I hope this helps
Jason
-- modified at 7:04 Wednesday 4th July, 2007
|
|
|
|
|
I think you should first factor in how complicated is the animation you are trying to execute.
Drawing in .NET is not the fastest solution by any means, and usually its as slow as you can get. So your issue might be more related to .NET's drawing performance more than to timing issues...when you demand high frame rates maybe .NET's drawing performance just can't keep up more than the message queue not processing the paint messages (as a matter of fact Invalidate messages skip the application queue and are processed immeadiately, so queueing is not the issue).
For any kind of serious animation I would rely on DirectX or OpenGL. NET Drawing namespace does and adequate job when it comes to what it was meant to do, but animation was not in the list IMHO.
hope this helps
P.D.1: First off, before plunging into new technology, I'd try optimising the code. Even if .NET is slow, it might be enough in your case but maybe your drawing routines are not coded well enough. Make sure you are disposing all disposable objects you "own" in your drawing implementation, you're releasing correctly any unmanaged resources you might be using, etc. Also check if maybe its worthwhile to cache any of objetcs you might be using and that way avoid creating and releasing them on every drawn frame, etc.
P.D.2: If you have to rely on some other solution then you dont have to plunge into 100% native code...check out Managed DirectX.
-- modified at 4:42 Thursday 5th July, 2007
|
|
|
|
|
CODE:
<br />
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8200/weboa/data.nsf/0/9212BC3EEF5F3B554825730E002B5C54?SaveDocument");<br />
request.Credentials = new NetworkCredential("admin", "password");<br />
request.Method = "POST";<br />
request.ContentType = "multipart/form-data; boundary=liubin_fengexian";<br />
request.Accept = "*/*";<br />
request.AllowWriteStreamBuffering = true;<br />
<br />
string sss = "--XXXXXXXX\r\n";<br />
sss += "Content-Dispostion: form-data; name=\"TestField\"\r\n";<br />
sss += "\r\n";<br />
sss += "AAAAAAAAAAAAAAAAAAA\r\n";<br />
sss += "--XXXXXXXX--\r\n";<br />
request.ContentLength = sss.Length;<br />
<br />
<br />
Stream s = request.GetRequestStream();<br />
<br />
byte[] b = Encoding.Default.GetBytes(sss);<br />
s.Write(b, 0, b.Length);<br />
s.Close();<br />
<br />
byte[] b2 = new byte[1024];<br />
WebResponse response = request.GetResponse();<br />
s = response.GetResponseStream();<br />
<br />
This code ERROR in
"WebResponse response = request.GetResponse();"
It said "HTTP server error:500 Internal server Error"
Why?
|
|
|
|
|
I made a project with the tx textcontrol.It works on my computer because I have the tx textcontrol installed.
But if I try to test my project on another computer where is not installed the tx textcontrol it doesn't work.
Do you have an idea ?
please help.
thanks
|
|
|
|
|
Try installing the tx textcontrol on the other computer.
Simon
|
|
|
|
|
erm.... are you serious ?
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
I want my project to work but installing the tx textcontrol is not a solution for my problem.
I want to use only the .dll to make my program to work.
I don't want to install the tx textcontrol.
|
|
|
|
|
darkcalin wrote: I don't want to install the tx textcontrol.
Then why did you use it? Wasn't it obvious that by using a control outside of the .NET framework you would have to install that control with your project?
|
|
|
|
|
|
I have a COM component developed in C#. but we have to develop addin for MS Office by using this Component(DLL).
I develop a shared addin “MyFirstAddin” and try to add reference for that DLL which is already developed in C#
But I am getting errors message when i am trying to add reference like that
"A reference to 'C:/Helper.dll' could not be added. this is not a valid assembly or COM component etc"
so if anybody have idea where i am wrong please share with me.
thanks
|
|
|
|
|
hi,
I am using winultragrid control for display a records from a database.
I want to change active color of a selected row.
|
|
|
|
|
You will more likely find someone to help at the Infragistics Forums[^] because they specialise in that sort of thing. Here is just general C#
Upcoming events:
* Glasgow: Mock Objects, SQL Server CLR Integration, Reporting Services, db4o, Dependency Injection with Spring ...
"I wouldn't say boo to a goose. I'm not a coward, I just realise that it would be largely pointless."
Ready to Give up - Your help will be much appreciated.
My website
|
|
|
|
|
Two ways of doing this:
1. Handle the AfterSelectChange event and use the grids ActiveRow.Appearance properties. e.g. Set the back color by calling. grid1.ActiveRow.Appearance.BackColor = Color.Blue;
2. Use the grids inbuilt design wizard - there is an "Appearance Browser" window where you can set an active rows appearance properties. This would be the best way to do it.
As mentioned by another post you should be able to get all the infragisitcs help you need from the infragistics forums or from the examples they provide with thier controls.
Goto the forums at: http://forums.infragistics.com/[^]
|
|
|
|
|
When I try to read a double value with the console.read method I get a completeley different value. In case of 0 I get 48, in case of 1 I get 49. I think these may be ASCII values. I also tried it with the convert.todouble method, but it didn't work. How can I get the correct values?
Thanks.
|
|
|
|
|
Yes they are ascii values. If you want to convert them to int just subtract 48
|
|
|
|
|
Subtracting an int from a float that's believed to be a int always returns an int, because ascii values are ints.
|
|
|
|
|
I guess it'd be better if you used Console.ReadLine() and then use float.TryParse() on the resulting string.
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
float.TryParse() needs 2 arguments: at first the string that is wanted to be converted, and the second I think is the variable I want to give the resault to.
string s;<br />
double x;<br />
s = Console.ReadLine();<br />
float.TryParse(s,x);<br />
Console.Write(x);
The compiler reacts with two errors:
2-argument: can't be converted from "double" into "float"
method has illegal arguments
Thanks.
|
|
|
|
|
Hello,
For the first error the compiler says it all.
you have to use float instead of double or use double.TryParse.
Second error is, that the second parameter is an out parameter and has to be marked like that.
string s = "";
float x = 0;
s = Console.ReadLine();
if(float.TryParse(s, out x))
Console.Write(x.ToString());
Hope it helps!
All the best,
Noch einen schönen Tag,
Martin
-- modified at 11:48 Wednesday 4th July, 2007
|
|
|
|
|
The question is, why use Float.TryParse() is you're dealing with Ascii values?
Cheers,
Vıkram.
After all is said and done, much is said and little is done.
|
|
|
|