|
Maybe he wants to make something like the ActiveX Control Test Container tool of VC++.
Maxwell Chen
|
|
|
|
|
Hi,
It is somthing like that.
But, it should show the dialog with all controls working instead of the ocx icon.
Thanks for the response.
Yeskay.
|
|
|
|
|
I know very little about ActiveX things. But maybe you can refer to the sample code.
URL: http://support.microsoft.com/kb/268470/en-us
(Sorry my system is having problem. It can not copy and paste texts on CodeProject.)
Maxwell Chen
|
|
|
|
|
Thanks for the link.
I'm able to understand the implementation. But, how do I create my OCX?
When I use my OCX or some other built in components, I'm able to see only the ocx icon (ellipse or circle) unlike calendar/DBGrid etc.
|
|
|
|
|
Hi all.
I need to emplement some problem, that its part is constantly running, for example, 20 threads.
I use the followong code:
<br />
<br />
<br />
<br />
#include <windows.h><br />
#include <stdio.h><br />
<br />
int counter = 0;<br />
int released = 0;<br />
int limit;<br />
<br />
int maxNumberOfThreads = 20;<br />
HANDLE threadCreator;<br />
HANDLE threadHandle;<br />
DWORD threadID;<br />
void Release()<br />
{<br />
CloseHandle(threadHandle);<br />
CloseHandle(threadCreator);<br />
}<br />
<br />
void Initilize()<br />
{<br />
limit = 0;<br />
threadCreator = CreateSemaphore(NULL, 0, 50, NULL);<br />
if(threadCreator)<br />
{<br />
Release();<br />
}<br />
}<br />
<br />
<br />
DWORD WINAPI Start( LPVOID lpParam )<br />
{<br />
WaitForSingleObject(threadCreator, INFINITE);<br />
printf("ID = %d\n", GetCurrentThreadId());<br />
--limit;<br />
++released;<br />
ReleaseSemaphore(threadCreator, 1, NULL);<br />
return TRUE;<br />
}<br />
<br />
void StartSimulation()<br />
{<br />
while(true)<br />
{<br />
if(limit < maxNumberOfThreads)<br />
{<br />
threadHandle = CreateThread(NULL, 0, Start, NULL, 0, &threadID); <br />
if(!threadHandle)<br />
{<br />
Release();<br />
}<br />
++limit;<br />
++counter;<br />
}<br />
if (counter == 100) break;<br />
}<br />
WaitForSingleObject(threadHandle, INFINITE);<br />
printf("Created %d threads.\nRelease %d threads.\n", counter, released);<br />
}<br />
int main()<br />
{<br />
Initilize();<br />
StartSimulation();<br />
Release();<br />
return 0;<br />
}
I understand that there is something wrong. Any ideas how to fix it and to make this work?
Thanks in advance.
|
|
|
|
|
You limit the maximal number of thread as 20, but in the while loop you test if(counter == 100) break; . The counter stops at value = 20. The loop can never break.
Maxwell Chen
|
|
|
|
|
Maxwell Chen wrote: You limit the maximal number of thread as 20, but in the while loop you test if(counter == 100) break;. The counter stops at value = 20. The loop can never break.
You are wrong. counter increased every time the thread created.
++counter;
There limit also decreased in the Start function:
--limit;
|
|
|
|
|
Evgeni57 wrote: You are wrong. counter increased every time the thread created.
I just traced your code step-by-step, and saw that.
++counter can only happen when the test (below) is true:
if(limit < maxNumberOfThreads)
Maxwell Chen
|
|
|
|
|
The problems in the code are various. There are problems with basic thread and semaphore managment. I have to guess at what the code is trying to do: create up to 20 simultaneous threads and wait until until a maximum of 100 threads have been created. Each thread uses a semaphore to block thread termination.
There are problems with initialization, creating and destroying threads and semaphores, and using the semaphores for thread communication.
Initialization
Both the handles for the thread and the semaphore aren't initialized.
The logic of Initilize (check spelling) looks flawed. If the call to CreateSemaphore is sucessful (which should be checked) then the handle returned is non-null. In that case Release is called which then closes the handle just created but does not reset the variable. So it looks like the program starts off with a bogus handle to an invalid semaphore.
Release() will try to close the threadHandle, which was never initialized, and loses access to the thread without knowing if it ever started or terminated properly. So at the end of a call to Release, assuming that CloseHandle does not raise an exception, threadHandle is invalid. Release is called after every unsuccessful call to CreateThread and threadHandle is invalid (NULL). So Release should be closing an invalid handle which should raise an exception.
Semaphore management
Assuming the initialization issues are dealt with, we can look at how the semaphore is managed. The semaphore is a "count up" value that signals when non zero. The semaphore is created in the non signaled state. Each thread begins by waiting until the semaphore is signaled and only then calls ReleaseSemaphore which increments the semaphore count and signals any other waiting threads. So the first thread will block on the sempahore. So will the second amd every other thread will because the sempahore was created in the non-signaled state. All threads wait for other threads to end and nobody ends.
Thread management
The StartSimulation is pretty flawed. The infinite loop and WaitForSingleObject with INFINITE time are problems waiting to happen. The exit condition for the while loop is when the counter variable reaches 100. The counter is incremented every time an attempt to create a thread is made. Attempts to create a thread are controlled by the limit variable. While it is less than maxNumberOfThreads threads are created. As each thread ends, limit is decremented. Since no thread will ever end due to the semaphore block, the variable quickly reaches the maximum of 20 threads. At that point the program goes into the infinite loop.
My recomendation is to use 2 semaphores and test each to be sure you know
how they work. One semaphore to control thread termination and one to control thread creation. Look closely at ReleaseSemaphore and pay attention to the 3rd argument. Check return values and don't wait forever on events.
|
|
|
|
|
Given the above, we change to code to get the program to run.
N.B. make sure you compile the code as a multi-threaded app.
const long MAXTHREADS = 100L;
const long MAXACTIVETHREADS = 20L;
int nThread = 0;
int nReleased = 0;
long lActiveThreads = 0L;
long lPreviousCount = 0L;
HANDLE hSemaphore = 0;
HANDLE hThread = 0;
const char *pSemaphoreName = "CreateThreadSemaphore";
bool Initialize()
{
bool bResult = false;
hSemaphore = ::CreateSemaphore(NULL, 0, MAXACTIVETHREADS, pSemaphoreName);
bResult = (0 != hSemaphore);
if (!bResult) {
}
return bResult;
}
DWORD WINAPI Start( LPVOID lpParam )
{
::WaitForSingleObject(hSemaphore, INFINITE);
printf("End thread %d\n", GetCurrentThreadId());
--lActiveThreads;
++nReleased;
::ReleaseSemaphore(hSemaphore, 1, &lPreviousCount);
return TRUE;
}
void StartSimulation()
{
while (nThread < MAXTHREADS) {
if (lActiveThreads < MAXACTIVETHREADS) {
DWORD dwThreadID = 0;
hThread = ::CreateThread(NULL, 0, Start, NULL, 0, &dwThreadID);
if (!hThread) {
} else {
printf("Start thread %d\n", dwThreadID);
::CloseHandle(hThread);
++lActiveThreads;
++nThread;
}
} else {
::ReleaseSemaphore(hSemaphore, 1, &lPreviousCount);
}
}
while (lActiveThreads) {
::ReleaseSemaphore(hSemaphore, 1, &lPreviousCount);
}
::CloseHandle(hSemaphore);
printf("Created %d threads.\n"
"Release %d threads.\n"
"PreviousCount %ld\n", nThread, nReleased, lPreviousCount);
}
int main()
{
if (Initialize())
StartSimulation();
return 0;
}
I changed variable names and removed unnecessary code but didn't implement all the changes I indicated. The output should give you some idea of how running threads behave.
|
|
|
|
|
Hi,
I am in Network domain.I am also the admin to my system.I need to create an user (using C++/VC++) who has access privileges to Program Files Directory .It should wotk with all windows versions.
Any Suggestions or links would be appreciated
Thanks
Satya
Today is a gift, that's why it is called the present.
|
|
|
|
|
narayanagvs wrote: Any Suggestions or links would be appreciated
Have you tried NetUserAdd() ?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
hi,
how to make check box control transparent when windows xp visual style is applied, i tried the following code but its work only if manifest is not included in application.
.
.
.
case WM_CTLCOLORSTATIC :
SetBkMode( (HDC)wParam , TRANSPARENT ) ;
return (LRESULT)hollow_brush ;
break ;
.
.
.
Thanks & Regards
|
|
|
|
|
Hi........
I have query.. How can i change the color of ToolBar Button controls at runtime.
|
|
|
|
|
For the 3D edges there's the TB_SETCOLORSCHEME message.
For the button bitmaps you need to change the bitmap associated
with the button or use TB_SETBUTTONINFO to set the button's image
to a bitmap with different color.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
On msdn2 website, when you search for a topic like Custom Draw,
then on the left tree, it will expand to the location CustomDraw.
Can MSDN installed local doing the same thing?
I can't find this function anywhere.
|
|
|
|
|
There is a button [Sync with Table of Content] on the toolbar. It only display the icon without text. The icon contains two green arrows, one pointing left and the other right.
Maxwell Chen
|
|
|
|
|
dear all
fatal error C1083: Cannot open include file: 'Centroids.h': No such file or directory;
the above problem occurred under compilation, i have already put header file "Centroids.h" in .cpp file, so what problem caused this case happened?
thanks a lot
Li Zhiyuan
4/01/2008
|
|
|
|
|
It should be in double-quote marks ("centroids.h").
You should also add the file(s) into the project.
Maxwell Chen
|
|
|
|
|
i added header file already,
Li Zhiyuan
5/10/2006
|
|
|
|
|
And what about another question of mine previously? (About the paths)
Maxwell Chen
|
|
|
|
|
How did you insert header file to your project?
|
|
|
|
|
i inserted header file in solution explorer, right click header files tap..and then choose add item..then choose .h file..i think this is no problem, it is right?
Li Zhiyuan
5/10/2006
|
|
|
|
|
1) Can you list the path of project, and the path of that file?
Example:
Project is at C:\Tmp\MyTest
Header file is at C:\Include\myheader.h
2) Any special characters in the path?
Maxwell Chen
|
|
|
|
|
li zhiyuan wrote: fatal error C1083: Cannot open include file: 'Centroids.h': No such file or directory;
What file is centroids.h being referenced from? Is this header file in a path that the IDE knows about? Have you tried using a fully-qualified path in the #include statement, like:
#include "c:/program files/microsoft visual studio/.../centroids.h"
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|