|
ok will give that a go later . Thanks
|
|
|
|
|
Yup, that exactly create a new file (assume you filtered SFD to *.xml).
I died as a mineral and became a plant,
I died as plant and rose to animal,
I died as animal and I was Man.
Why should I fear? When was I less by dying?
-- Rumi[^]
My blog
|
|
|
|
|
Chris Kentlea wrote: This is the code for the SAVE function(eg overwrites the current file)..i'm trying to add a SAVE AS functionality to it
The obvious way to do this is to factor out a save method that takes a path, then either show a dialog box to select a path and pass it along, or pass on the existing path, in the two event handlers.
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
So I have some sample code, it works fine.
using System;
using System.Threading;
using System.IO;
namespace whatever
{
class t
{
public static TextWriter tw = new StreamWriter("date3.txt");
static void Main()
{
Thread firstThread = new Thread(new ThreadStart(Fun1));
Thread secondThread = new Thread(new ThreadStart(Fun2));
firstThread.Start();
secondThread.Start();
tw.WriteLine("End of Main()");
}
public static void Fun1()
{
for(int i=1; i<=500;i++)
{
tw.WriteLine("Fun1() writes: {0}",i);
}
}
public static void Fun2()
{
for (int i=0; i>= -200; i--)
{
tw.WriteLine("Fun2() writes: {0}",i);
}
}
}
}
From my understanding from what I've read, both firstThread and secondThread should be executed simultaniously, but my output shows that thread one finishes (outputs 0-500), then "End of Main()", followed by the output of Fun2 (0-200).
Shouldn't it have been mixed in there (the output from Fun1 and Fun2), or is each thread executed after the previous terminates?
|
|
|
|
|
Similar results here, although sometimes I get this:
Probable I/O race condition detected while copying memory. The I/O package is not thread safe by default. In multithreaded applications, a stream must be accessed in a thread-safe way, such as a thread-safe wrapper returned by TextReader's or TextWriter's Synchronized methods. This also applies to classes like StreamWriter and StreamReader.
I think it's just a case of the time taken to create the thread is longer than it takes to execute Fun1(). Change it from 500 to 5000000 and -200 to -2000000 and you'll get your interleaving - or would if it was threadsafe of course.
Regards,
Rob Philpott.
|
|
|
|
|
Ahh thanks, I first ran it with extremely small numbers (0 to 10, 0 to -10) and thought my 500/-200 changes would allow me to have the overlapping results I was testing for. Going to try now and if it works, I guess the error on my part is assuming the speed of threads to be higher/ slower then I expected.
Next time I'll test more thoroughly before posting.
Thanks again
|
|
|
|
|
EliottA wrote: Ahh thanks, I first ran it with extremely small numbers (0 to 10, 0 to -10) and thought my 500/-200 changes would allow me to have the overlapping results I was testing for. Going to try now and if it works, I guess the error on my part is assuming the speed of threads to be higher/ slower then I expected.
In non realtime OSes the overhead involved in swapping threads is high enough that they generally get several milliseconds at a minimum before being swapped out. Realtime OSes can do the swap much faster, and have significantly smaller time slices as a result, but have their own limitations due to the architectural changes needed to support the fast switching.
Today's lesson is brought to you by the word "niggardly". Remember kids, don't attribute to racism what can be explained by Scandinavian language roots.
-- Robert Royall
|
|
|
|
|
A follow up:
500000/-200000 worked and I had overlapping results.
Thanks for the help.
|
|
|
|
|
EliottA wrote: From my understanding from what I've read
Read where?
EliottA wrote: both firstThread and secondThread should be executed simultaniously
I don't know where you got that from, but that contradicts what I know about using multiple threads. Without knowing what you read, I can only guess that either your source is incorrect or you did not understand it correctly.
led mike
|
|
|
|
|
|
led mike wrote:
ElliotA wrote: both firstThread and secondThread should be executed simultaniously
I don't know where you got that from, but that contradicts what I know about using multiple threads. Without knowing what you read, I can only guess that either your source is incorrect or you did not understand it correctly.
The threads can run concurrently on a multithreaded system. Only on a single core non HT system is sequential/interleaved behavior guaranteed.
Today's lesson is brought to you by the word "niggardly". Remember kids, don't attribute to racism what can be explained by Scandinavian language roots.
-- Robert Royall
|
|
|
|
|
Hi,
on a single core without hyperthreading the CPU will be used by one thread until it runs out of a job, or something really significant occurs that makes the OS decide to switch threads; threads are not switching all the time, it is just too expensive.
You could add a random delay (with Thread.Sleep) to one or both of your threads; and then you could set one of them at a "below normal" priority, to make things more interesting (make sure the highest priority one has reasons not to finish in one stint).
As soon as hyperthreading or multi-core hardware is involved, two or more threads may really run at the same time, until or unless they get synchronized somehow. Both of them using the same TextWriter will synchronize them: the class has to do something to prevent characters of multiple lines (from different threads) getting intertwined.
Another experiment would be:
have one integer counter as class members.
thread1 increments counter and stores value of counter in a List<int>
thread2 decrements counter and stores value of counter in another List<int>
Don't call any I/O in those threads, don't create a possible synchronization point, just let them try to get 100% of the CPU cycles.
After some time, stop both threads and list (part of) one or both Lists.
Without multicore/HT the lists will be monotonous for a long time (say 16 msec); with MC/HT they ideally would oscillate around zero assuming identical code in both threads, and they would evolve "slowly" if one of the threads wastes some cycles with respect to the other (by adding some statements that don't get optimized away).
|
|
|
|
|
So if I am not running on a multithreaded processor, ad you are saying each thread will be executed in order that they are started, why bother creating multiple threads at all??? Where is the gain? Wow Now you guys just made me have 1000 questions, which I am sure 999 will be stupid.
|
|
|
|
|
Hi,
Basically multi-threading is to an app, what multitasking is to a system.
So the potential gain is twofold:
1.
as soon as one thread can not continue (e.g. pending I/O) instead of the CPU becoming idle (assuming only one app is present), another thread will take over, hence the total app's elapsed time CAN be much less than when you do everything sequentially on a single thread.
2.
your app MAY be much simpler to write in a multi-threaded way: you might ignore how the events in different threads will occur in real-time, and get away with it. In a single thread things are bound t occur in the order they were programmed in code, which may or may not be an accurate representation of the outside world.
However, thread synchronization may be a concern, if you don't synchronize, results may be wrong; and if you don't synchronize correctly, deadlocks may occur, causing your app to hang.
|
|
|
|
|
Yay!!! I love it when things go back to basics!
j.t.
|
|
|
|
|
This is more of a Video question. I hope someone out there can help me out, and if so, I really appreciate it. I am trying to modify the DVD Player sample for DirectShow to use VMR9 with the allocator and presenter. I setup code to RenderDvdVideoVolume with the VMR9Only flag and I added code to FindFilterByName for the Video Mixing Renderer 9 from the filtergraph. I get the filter and it is not null. Then I want to configure the filter, so I get the IVMRFilterConfig9 interface by casting my filter to that interface as done in quite a few of the examples. By the way, this is being done on a machine with Windows Vista. Next, when I use the config interface to configure the VMR9 filter, I run into problems. If I try to set the rendering mode or the number of streams I get an exception that tells me "The operation could not be performed because the filter is in the wrong state." I have looked all over for solutions to this, but I have not had any luck. Below is a snippet of my code and the VMR9 filter is declared outside of this snippet as a private IBaseFilter.
int hr;
AMDvdRenderStatus status;
object comobj = null;
try
{
dvdGraph = (IDvdGraphBuilder)new DvdGraphBuilder();
//filter = (IBaseFilter)new VideoMixingRenderer9();
//hr = dvdGraph.RenderDvdVideoVolume( null, AMDvdGraphFlags.None, out status );
hr = dvdGraph.RenderDvdVideoVolume(null, AMDvdGraphFlags.VMR9Only, out status);
DsError.ThrowExceptionForHR( hr );
hr = dvdGraph.GetDvdInterface( typeof( IDvdInfo2 ).GUID, out comobj );
DsError.ThrowExceptionForHR( hr );
dvdInfo = (IDvdInfo2) comobj;
comobj = null;
hr = dvdGraph.GetDvdInterface( typeof( IDvdControl2 ).GUID, out comobj );
DsError.ThrowExceptionForHR( hr );
dvdCtrl = (IDvdControl2) comobj;
comobj = null;
hr = dvdGraph.GetFiltergraph( out graphBuilder );
DsError.ThrowExceptionForHR( hr );
hr = graphBuilder.FindFilterByName("Video Mixing Renderer 9", out filter);
DsError.ThrowExceptionForHR(hr);
if (filter == null)
{
MessageBox.Show("Need to add the VMR9 Filter");
}
IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)filter;
//**********
// This is where I run into the exception
//**********
//hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless);
hr = filterConfig.SetRenderingMode(VMR9Mode.Windowed);
DsError.ThrowExceptionForHR(hr);
hr = filterConfig.SetNumberOfStreams(1);
DsError.ThrowExceptionForHR(hr);
SetAllocatorPresenter();
mediaCtrl = (IMediaControl) graphBuilder;
mediaEvt = (IMediaEventEx) graphBuilder;
hr = dvdGraph.GetDvdInterface( typeof( IVideoWindow ).GUID, out comobj );
DsError.ThrowExceptionForHR( hr );
videoWin = (IVideoWindow) comobj;
comobj = null;
GetFrameStepInterface();
return true;
}
catch( Exception ee )
{
MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DVDPlayer.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
CloseInterfaces();
return false;
}
finally
{
if( comobj != null )
{
Marshal.ReleaseComObject( comobj );
comobj = null;
}
}
I was able to get part of this problem figured out. To configure the filter, it has to be done before rendering the video with the call to RenderDvdVideoVolume(). My next problem I have run into is setting up the AllocatorPresenter. The call to GetDvdInterface() with the IVMRSurfaceAllocatorNotify9 interface is returning a message that states "No such interface supported". I need to determine a way to get around this. Any help would be greatly appreciated.
Thanks in advance.
GrizMan
modified on Tuesday, December 2, 2008 10:54 AM
|
|
|
|
|
This is a late comment, but the Microsoft documentation states that you can get the VMR9Config and VMR9AplhaBitmap interfaces by calling IDVDGraphBuilder:GetDVDInterface()
IE:
hr = dvdGraph.GetDvdInterface(typeof(IVMRFilterConfig9).GUID, out comobj);
and
hr = dvdGraph.GetDvdInterface(typeof(IVMRMixerBitmap9).GUID, out comobj);
You do this before you call the RenderDVDAudioVideo and the graph understands that you want to use the VMR. Past that, you should be able to follow the VMR samples.
I think that the only thing that you really need is to get the MixerBitmap interface and then you can send an Alpha bitmap from a mem dc anytime that you want. I could be incorrect on that.
Myself, I am getting an hr = 1 on RenderDVDAudioVideo. Is strange, as I can manually build the graph I want.
MB
|
|
|
|
|
How much does Try... Catch blocks slow down your code?
I understand that if you have one it's nothing, but if you have multiple try... catches that are nested, how will efficiency and speed be effected?
If there is a significant decrease in efficiency and speed, what would be the best way to regain that lost efficiency without compromising integrity and catching those exceptions?
(Sorry if this post isn't directly related to C#, I'm well aware it should have gone in .NET framework, but I wasn't quite to sure if this could be a direct C# issue if at all and wasn't so concerned for a c++.net/CLI or VB.net answer)
|
|
|
|
|
EliottA wrote: How much does Try... Catch blocks slow down your code?
Not at all. They can actually be quicker than having to test everything to avoid Exceptions.
|
|
|
|
|
Everything I've read suggests that having try/catch blocks does not affect performance. The only way performance is affected is if you are throwing exceptions.
(And yes, this is a general .NET thing, not a C# specific one)
|
|
|
|
|
EliottA wrote: How much does Try... Catch blocks slow down your code?
I've never seen it slow down any of my apps.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
|
|
|
|
|
Hi,
the try statement pushes some information to the execution stack; this info gets popped again when the try block closes without exceptions; or the stack gets searched for it when an exception occurs (that is the purpose of the info). So a try statement has a small cost associated with it.
Manual nesting of try blocks will have a limited depth, and typically only the inner one will be relevant; now there is no way around if you want to catch a possible exception at that level (e.g. because you want to continue with the next iteration of the inner loop).
And you can't easily nest try blocks programmatically (if would take run-time code generation to do that), unless you have a recursive method. Which is the way to go if you want to measure the try cost: write a recursive program containing a stopwatch and run it; then add a try-catch to the recursive method and measure it again. You probably will not see a significant difference, the recursion is much more costly than the try statement itself.
Here is some test code:
public override void Test(int arg) {
long rep=100000;
long n=1000;
Stopwatch sw=new Stopwatch();
sw.Start();
for (int i=0; i<rep; i++) sw.Stop();
log(sw.ElapsedMilliseconds.ToString());
Stopwatch sw2=new Stopwatch();
sw2.Start();
for (int i=0; i<rep; i++) sw2.Stop();
log(sw2.ElapsedMilliseconds.ToString());
}
long fact(long n) {
if (n<=1) return 1;
return n*fact(n-1);
}
long fact2(long n) {
try {
if (n<=1) return 1;
return n*fact2(n-1);
} catch (Exception) {
return 0;
}
}
modified on Wednesday, November 26, 2008 4:39 PM
|
|
|
|
|
Hi All!
I am trying to search for any URL inside files on my hard drive and these URL's could be anywhere inside the file, surrounded by letters/numbers etc and place each found URL into a listbox or string but it is proving to be very difficult. I was wondering if anybody might have any pointers/samps/links they could kindly share? Id appreciate any help I can get from anybody. Thanks for your time
Regards,
j.t.
P.S.
the code i have is as follows but something tells me i'm goin' about this the wrong way...:
private void SearchButton_Click(object sender, EventArgs e)
{
string fName = FileList.SelectItem.Text;
StreamReader testTxt = new StreamReader(fName);
string allRead = testTxt.ReadToEnd();
testTxt.Close();
string regMatch = "http://www." + <word> + ".com"/".net"/".org";
if (Regex.IsMatch(allRead, regMatch))
{
SearchQueryTextBox.Text = (regMatch + " was found.");
}
else
{
SearchQueryTextBox.Text = (regMatch + " could not be found.");
}
}</word>
j.t.
|
|
|
|
|
You don't cover https, or urls that were stored without the www or the http://, or with something else. You also assume all sites are American. But, if you clean up the regex, this is certainly the way to go about it.
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
Thanks I'm still a little stuck though, I don't know what to do next.
j.t.
|
|
|
|
|