|
Congratulation CPallini .
|
|
|
|
|
And, again, best wishes.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
I'm not very good in ActiveX implementation. So, I dont know what MFC supports for activeX. I just wanted tyo know if anyone had tried such funtionality that I've asked.
I've seen some activeX controls getting loaded in the view, but i cannot understand how.
Anyway, thanks for the replies.
|
|
|
|
|
Yeskay wrote: I just wanted tyo know if anyone had tried such funtionality that I've asked.
I've seen some activeX controls getting loaded in the view, but i cannot understand how.
Well, I made a little test (using the standard ActiveX Calendar Control ) and it is not such a difficult task. I made the following steps (VS2005):
(1) Create an MFC SDI project (support for ActiveX controls is enabled by default)
(2) Select Project->Add Class menu item and then choose (in the appeared dialog) MFC->MFC Class From ActiveX Control , finally click Add button.
(3) Select Calendar Control in the list of available Active X Controls (in the newly shown window), then select needed interfaces (Calendar Control has only one available), finally click finish button.
Now the class wizard creates a class wrapping the ActiveX Control , and you can use such class. Hence, in the view source code:
(4) Include the created class (for me was CCalendar ) header (again it was Calendar.h )
(5) Add a member variable to hold an instance of the class (I used CCalendar * m_pCalendar; )
(6) Override CView::OnInitialUpdate method and inside it create an instance of the class and the call its Create method, for instance, I made
m_pCalendar = new CCalendar();
RECT rc;
GetClientRect(&rc);
m_pCalendar->Create(_T("Calendar"), WS_VISIBLE, rc, this,100);
(7) Enjoy the calendar control (and don't forget cleanup)
I'm sure you're able to adapt the above scenario to your needs, but
please note this was a quick experimental attempt, maybe there are better ways to accomplish the task.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks for the help.
But, how the ocx should be created? Is there any design aspect to be taken care? Because, for some ocx, we can see only the ellipse/circle when we do like above. We are not getting the ocx component with all its functionality.
May be this is a stupid question...But, I dont understand how the ocx's are created to get show the component when we host in view.
|
|
|
|
|
Does your ActiveX work? I mean, if you put it, for instance, inside a very simple VB6 container, do you see all the GUI magic?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
I'm able to implement as per my requirement(with controls in the dialog).
Thanks a lot for your comments
|
|
|
|
|
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
|
|
|
|
|