|
|
|
How can i put all dll´s (into Inno Setup) that my program needs to work?
|
|
|
|
|
Hi,
I use a thread, whitch I have created with 'AfxBeginThread'. Within this thread I use an endless while loop [while(1) {//do some thing}]. Is it possible to terminate this thread by the thread-caller? All I could find is to use the TerminateThread function but to do this I have to use before the DuplicateHandle function. Unfortunately I was realy not very successfull by trying this. Can anybody help please?
Thanks a lot
Vassili
|
|
|
|
|
If it is a worker thread, you simply need to exit the thread function. If it is a UI thread, you need to post a WM_QUIT message.
|
|
|
|
|
Yes, it is a worker thread. In my endless while loop I read the serial port. On an port event I send a message to the main program. I also send a message to the main program with the handle of the thread by using GetCurrentThread()
UINT TheThread(LPVOID pParam)
{
HANDLE* pObject = (HANDLE*)pParam;
HANDLE hThread;
.
.
.
hThread = GetCurrentThread();
SendMessage(pObject, WM_MY_MESSAGE, 0, (LPARAM) hThread);
while(1)
{
//here I read the CommPort
.
.
}
return 0;
}
--In the main Program:
LRESULT CMyDlg::MyFunction(WPARAM wParam, LPARAM lParam)
{
m_hThread = (HANDLE) lParam; //m_hThread is a private HANDLE variable of CMyDlg
return 0L;
}
void CMyDlg::OnWhatEver()
{
//TerminateThread(m_hThread, -1);
//CloseHandle(m_hThread);
}
If I use TerminateThread((m_hThread, -1) the application disappears but a process is still running which I have to terminate with the Task Manager. If I use CloseHandle(m_hThread) nothing happens...
You posted befor that I need simply to exit the thread function - this is exactly what I want to do, but how?
|
|
|
|
|
Vassili wrote:
...I need simply to exit the thread function - this is exactly what I want to do, but how?
Change your while(1) loop to have a more meaningful condition. For example:
bool bContinue = true;
while (true == bContinue)
{
}
return 0;
|
|
|
|
|
Hi again,
within the while loop I use the function ReadFile(...). This means that if there is nothing to read from the serial port the process will not step to the next line. It will remain in the ReadFile-step until a new information will come through the port. Because of this I can't use a condition like bContinue. On the other hand only the main program knows when to end the thread. So the question is: is there a way to terminate my thread from the main program? If not then I will have to redesign my complete program
|
|
|
|
|
Is the handle being used by ReadFile() synchronous or asynchronous? By your description, it sounds as though a synchronous handle is being used, thus the blocking in which you describe.
|
|
|
|
|
[edit] Sorry, did not see you already mentioned it. Why do you use DuplicateHandle?[/edit]
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
but this is never recommanded...
~RaGE();
|
|
|
|
|
The sensible way to terminate a thread is to make it terminate itself - generally by setting some sort of flag to signal that the thread should terminate. In its simplest form, the code looks something like this:
extern bool bTerminateFlag;
int YourThreadFunction(LPVOID pParam)
{
while (!bTerminateFlag)
{
do_something...
}
return exit_code;
}
And your function to terminate the thread would look something like this:
int TerminateWorkerThread(HANDLE hWorker)
{
bTerminateFlag = true;
if (WaitForSingleObject(hWorker, INFINITE)!=WAIT_OBJECT_0)
{
}
else
{
return GetExitCodeThread(hWorker);
}
}
This is all very simplified - you'd want proper error checking, you probably shouldn't use a global variable as the terminate flag, and you shouldn't really use WaitForSingleObject in a thread with a message loop. But the principle is there. There's generally very little reason to use TerminateThread, and it can lead to all sorts of problems when your thread is doing something worthwhile, and holding resources open, because the terminated thread doesn't get to do any cleanup.
"We are the knights who say Ni" (The Knights Who Say Ni)
|
|
|
|
|
Hi, everyone!
Suppose I have a table in a database. The table has three
columns: "name", "birthday" and "password".
I want to do such operations:
1. query user by some condition
2. change user password and birthday
I use the following classes to describe the module. I want to
learn your suggestions about my design.
My Design:
--------
Class User {
string name;
string birthday;
string password;
changePassword()
{
...
}
changeBirthday()
{
...
}
}
class UserTable {
User* queryByCondition (string condition)
{
//query database by condition
//return an User array
}
}
--------
Thanks in advance,
George
|
|
|
|
|
I think that your encapsulation of User in a class is a good idea, but I wouldn't necessarily create a class to represent the table itself. It is normally better to create a data access layer to handle transactions with the database. You can just create this layer and ask it to populate your data object (User) for you. I would handle all database access this way, so the User class should have a base class that all data objects inherit from. If you do a search on google 'Data Access Layer', you should be able to gain a deeper understanding of the concept. Here is an interesting link I found with that search: http://www.15seconds.com/issue/020611.htm.
Best Regards and good luck.
-Matt
------------------------------------------
The 3 great virtues of a programmer:
Laziness, Impatience, and Hubris.
--Larry Wall
|
|
|
|
|
Hi everyone,
How can I use the XOR mode for the FillRect API call. I have a background bitmap and I want to highlight specific portion of it using the XOR mode.
Thanks,
Pankaj
Without struggle, there is no progress
|
|
|
|
|
To invert (= source xor -1) a rectangle you can use the InvertRect API.
-Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
When I compile my mfc-application in UNICODE mode, the unicode characters are displayed inocerrctly in a list window. But when I MessageBox() the unicode string, it's ok.
(When compiling as ansi, the unicode goes ????)
Any suggestions.
I know that the first message must be unicode, for windows to know that a new window should be unicode, but with UNICODE defined, this should be no issue, if not calling XxxA() which I don't.
|
|
|
|
|
Remember to define both UNICODE and _UNICODE
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
Hiya what is the best way to completely clear a structure for re-use. Want to initialize it with 0 when program starts.
This is my structure:
struct s_Worked
{
char DaysWorked[15];
}Worked[100];
Thanks,
grahamoj
|
|
|
|
|
I use the ZeroMemory API function when possible.
ZeroMemory(&YourStruct, sizeof(YourStruct)); or
memset(&YourStruct, 0, sizeof(YourStruct)); -Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
I use this template class.
<br />
template <class T, int FILL=0> class auto_zap : public T<br />
{<br />
public:<br />
auto_zap()<br />
{<br />
memset(static_cast<T *>(this), FILL, sizeof(T));<br />
}<br />
<br />
void zap()<br />
{<br />
memset(static_cast<T *>(this), FILL, sizeof(T));<br />
}<br />
<br />
auto_zap<T> & operator=(const T &rhs)<br />
{<br />
*static_cast<T *>(this) = rhs;<br />
return *this;<br />
}<br />
};<br />
--------
There are 10 types of people in this world. Those who know binary and those who don't.
|
|
|
|
|
Try this:
struct s_Worked
{
char DaysWorked[15];
} Worked[100] = { 0 };
Software Zen: delete this;
|
|
|
|
|
Hi, everyone!
There are two operator >> overload functions in my class. And
both work OK. I have read some codes by others that the
function which overloading operator >> usually has two forms. One form
is returning null and another form is returning ostream&.
I want to know what is the difference between them. Which way is
better or in which case should I use the first form and vice versa.
Codes:
--------
#include <iostream>
#include <fstream>
using namespace std;
class A {
private:
int a;
public:
A (int a)
{
this->a = a;
}
operator << (ostream& os)
{
os << a;
}
ostream& operator << (ostream& os)
{
os << a;
return os;
}
};
int main()
{
A a(10);
ofstream f ("c:\\test.txt");
a << (f);
return 1;
}
--------
Thanks in advance,
George
|
|
|
|
|
You should implement your overload as returning an ostream& , so that you can concatenate several >> operations in the same sentence. COnsider for instance:
ostream os;
...
A a;
int i;
os>>a>>i; The last sentence is equivalent to
(os>>a)>>i or, tu put it more clearly
os.operator>>(a).operator>>(i); If your overload returned void , clearly the sentence would make no sense. So it is always better to return an ostream& . The impact on efficiency is usually negligible, or even none at all if the function is inlined.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks, Joaquín buddy!
George
|
|
|
|
|
can somebody help in finding out,how to display a number in local currency format? Is there any function that converts a nuber into the local currency?
|
|
|
|