|
Thanks for all your replies. Yep, I think my question should state as 'Parallel/simultaneous processing of multiple threads'. Synchronization is more related to resource sharing between threads. The problem is to run both threads exactly at same speed and at the same time (which assures the frame rate). I have tried several ways by defining the priority classes to both threads to HIGH_PRIORITY_CLASS and setting their priority to PRORITY_TIME_CRITICAL, but still 'sometimes' I am getting a difference of one frame between 2 threads. I am running my application on a Dell Precision 670 (Dual xeon processors) with 2 threads on each core.
Here is how my application works-
I am having 2 waveform generating boards on 2 of my 64-bit PCI slots. In my application I am generating waveforms on both of these boards and each thread generates waveforms on each of these boards. These boards will have on-board buffers where we can store the data to be generated as waveforms. Since these buffers are to be in multiples of 1024 and my data is not in multiples of 1024, as usual, I am using rotating buffers. The board buffers, data buffers are completely independent for both threads (each thread is having its own buffers), so no data is shared between these threads except the intial flag variable which initiates the starting loop in the thread. Neither of these threads change the flag. They just use it to start their wave form generating loop (just like as a trigger signal).
At last I would like to know how we can make sure these threads run at the same rate and speed and at any given instant of time they both should be at the same point of execution (one more thing is both these threads have exact and same number of instructions).
thanks,
-Pavan
|
|
|
|
|
hello
when I write :
mouse_event(MOUSEEVENTF_RIGHTUP
,mouse.x
,mouse.y
,0
,GetMessageExtraInfo());
it works , but with MOUSEEVENTF_LEFTUP notting happens.
do anyone knows anyway?
thanks
|
|
|
|
|
how to access com port in VC++
|
|
|
|
|
Using CreateFile() is one way.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
#ifndef _COMPORT_H
#define _COMPORT_H
#include <afxwin.h>
//////////////////////////////////////////////////////////////////////
class Comport
{
private:
HANDLE hdev;
int slen;
int rxp;
char sbuf [1024];
public:
int Com, Baud;
Comport ();
~ Comport ();
int Open ( int com, int baud );
void Close ();
void SetBaud ( int baud );
void CommState ();
void CommTO ();
int read ( char * s, int size );
int write ( char * s, int size );
int putc ( char c );
int puts ( char * s );
int getc ();
int Read ();
int SendFile ( const char * );
};
//////////////////////////////////////////////////////////////////////
#endif
#include "timer.h"
#include "comport.h"
#include <stdio.h>
/**************************************************************/
Comport :: Comport ()
{
hdev = 0;
Com =
Baud = 0;
}
/**************************************************************/
Comport :: ~ Comport ()
{
Close ();
}
/**************************************************************/
void Comport :: Close ()
{
if ( hdev && CloseHandle ( hdev ) == FALSE )
{
}
hdev = 0;
Com =
Baud = 0;
}
/**************************************************************/
Comport :: Open ( int com, int baud )
{
if ( Com && hdev ) Close ();
if (!( Com = com )) return 0;
Baud = baud;
char s [255];
sprintf ( s, "\\\\.\\COM%d", Com );
hdev = CreateFile ( s, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
int error = GetLastError();
// hdev = (void*)HFILE_ERROR;
if ( (int) hdev != HFILE_ERROR )
{
CommState ();
CommTO ();
}
else Com = 0;
return Com;
}
/**************************************************************/
void Comport :: SetBaud ( int baud )
{
if ( Com )
{
Baud = baud;
CommState ();
}
}
/**************************************************************/
void Comport :: CommState ()
{
DCB dcb;
GetCommState ( hdev, & dcb );
dcb .BaudRate = Baud;
dcb .ByteSize = 8;
dcb .StopBits = ONESTOPBIT;
dcb .Parity = NOPARITY;
dcb .fBinary = 0;
dcb .fParity = 0;
dcb .fOutxCtsFlow = 0;
dcb .fOutxDsrFlow = 0;
dcb .fDtrControl = DTR_CONTROL_DISABLE;
dcb .fDsrSensitivity = 0;
// dcb .fTXContinueOnXoff =
dcb .fOutX = 0;
dcb .fInX = 0;
dcb .fErrorChar = 0;
dcb .fNull = 0;
dcb .fRtsControl = RTS_CONTROL_DISABLE;
dcb .fAbortOnError = 0;
SetCommState ( hdev, & dcb );
}
/**************************************************************/
void Comport :: CommTO ()
{
COMMTIMEOUTS cto;
cto .ReadIntervalTimeout = MAXDWORD;
cto .ReadTotalTimeoutMultiplier = 0;
cto .ReadTotalTimeoutConstant = 0;
cto .WriteTotalTimeoutMultiplier = 0;
cto .WriteTotalTimeoutConstant = 0;
SetCommTimeouts ( hdev, & cto );
}
/**************************************************************/
int Comport :: read ( char * b, int size )
{
DWORD n = 0; //bytesRead
ReadFile ( hdev, b, size, & n, 0 );
return n;
}
/**************************************************************/
int Comport :: write ( char * b, int size )
{
DWORD n = 0; //bytesWritten
WriteFile ( hdev, b, size, & n, 0 );
return n;
}
/**************************************************************/
int Comport :: putc ( char c )
{
return write ( & c, 1 );
}
/**************************************************************/
int Comport :: puts ( char * s )
{
return write ( s, strlen (s) );
}
/**************************************************************/
int Comport :: SendFile ( const char * path )
{
int n = 0;
if (Com)
if ( FILE * fp = fopen ( path, "rt" ) )
{
Ticker t(50);
char s [100] = {0};
while ( fgets ( s, 100, fp ) )
{
while (!t .expire () );
n += write ( s, strlen (s) );
}
}
return n;
}
/**************************************************************/
int Comport :: Read ()
{
rxp = 0;
DWORD size = 0;
if (Com)
ReadFile ( hdev, sbuf, 1024, & size, 0 );
return slen = size;
}
/**************************************************************/
int Comport :: getc ()
{
coerce ( 0, 1023, rxp );
coerce ( 0, 1023, slen );
return ( rxp < slen ) ? sbuf [ rxp ++ ] : 0 ;
}
/**************************************************************/
/*int Comport :: getc ()
{
char inbuf [25] = {0};
read ( inbuf, 1 );
return inbuf [0];
}
/**************************************************************/
Just livin a dream.. dont wake me!
|
|
|
|
|
See Here[^] maybe it is some helpful to you
whitesky
|
|
|
|
|
I have all strings in a mySQL table and then use a Perl script to create .rc files for the different languages.
I can than add one of those .rc files to my resource includes for a particular language.
My problem now is that I want a single exe without satellite DLLs for the different languages. That doesn't seem to be possible, because each string id can only be in one string table and it is also not possible to select a particular string table.
My idea now was to add XML files with the strings to my resources and to overload LoadString. But I'm not sure if that also works with unicows on Win9x?
Are there any other options to support multiple languages from a single exe?
Thanks André
|
|
|
|
|
One possibility is to use ranges. Thus, all English strings could zero based, all of language 2 could start at 10,000; language 3, 20,000 and so forth. This is limiting, but can be done.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Joe Woodbury wrote: One possibility is to use ranges.
Unfortunately that doesn't work, at least not without a custom LoadString function. LoadString looks in the table for an id (number) and then copies the string from the table to the buffer. Therefore it would always load the string of the language without an offset.
|
|
|
|
|
ABuenger wrote: at least not without a custom LoadString function.
That goes without saying.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Joe Woodbury wrote: That goes without saying.
extern "C"<br />
{<br />
int WINAPI LoadStringW (HINSTANCE hInstance, UINT uID, LPWSTR lpBuffer, int nBufferMax)<br />
{<br />
return 0;<br />
}<br />
};
Results in a warning C4273: 'LoadStringW' : inconsistent dll linkage. dllexport assumed.
And my own function never gets called
|
|
|
|
|
I wouldn't overload LoadString directly. Rather I'd add a function like MyLoadString which would have smarts about what the current language is and all that. The advantage of this is that it could account for language neutral strings and whether satellite DLLs are used or not--in other words, the rest of your code wouldn't care where the strings are or how they are organized. For CString, you could have an overloaded version of MyLoadString that took a reference to a CString object and the ID (or you could always return a CString--there are many possibilities.)
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Joe Woodbury wrote: I wouldn't overload LoadString directly. Rather I'd add a function like MyLoadString which would have smarts about what the current language is and all that.
That doesn't work, MFC as well as the UI toolkit calls LoadString for menus/toolbars
|
|
|
|
|
There is an article on CP somewhere that discusses this problem exactly. I'm having trouble finding it at the moment, but from what I remember about the article, each DLL was basically nothing more than a resource holder (specifically for string tables in different languages). The author added a menu item allowing the user to change the default language and the next time the program was run, it would load the dll for that language instead. If you do a little searching around CP, you can probably find it.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Thanks, but as already said I don't want to use satellite DLLs, I prefer to have a single exe to distribute.
|
|
|
|
|
Then your only hope is to put every language you want to support into your string table use an offset when loading strings. That is, every call to LoadString would look something like this:
CString str("");<br />
str.LoadString(IDS_MYSTRING + (iCurrentLanguage * ms_Offset));
This isn't very flexible since you have to make sure that a given string is offset exactly for each language.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
hello again
I have added new item in string table of my project :
IDS_SOMETHING "SomeText"
How to retrieve the string value of the IDS_SOMETHING in my project ?
thank you
|
|
|
|
|
Look at CString::LoadString
|
|
|
|
|
|
|
Hello
Can anybody explain what is a source control ? why is it useful ? and where can I download one.
thank you.
-- modified at 11:34 Tuesday 27th June, 2006
|
|
|
|
|
|
big_denny_200 wrote: what is a source control ?
It's a source files mamangement system.
big_denny_200 wrote: why is it useful ?
It manages source files:
1) Providing repository
2) Coordinating development in a team environment
3) Easying source code backup
4) Automating release configuration
5) etc.
big_denny_200 wrote: where can I download one
For Windows, Visual Studio Enterprise Edition provides "Visual Safe Source" tool. For free downloads, google "cvs for windows". For Linux, check out GNU websites for GNU CVS.
Best,
Jun
|
|
|
|
|
Try having a look at the first few chapters of Version Control with
Subversion[^], which talks about the Subversion[^] product.
Subversion is a pretty nice SCM/RCS product, BTW...
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|