|
This is Unix time (UTC) use the time functions. For an example see[^].
|
|
|
|
|
mbatra31 wrote: I have one query again. this function gives the Last logon and Logoff time
in the number of seconds that have elapsed since 00:00:00, January 1, 1970, GMT.
How can I get the correct value in Time format. Converting time since that epoch was something I learned very early on in my career (some 25 years ago). It's worth the effort at figuring it out (without the help of Google).
mbatra31 wrote: Also I want to get the record of user logon and logoff time for each day.
Should I use the same function.? Since the above is always referenced from a fixed point in time, you'd need to "capture" it once per day. Admittedly, there may be a log somewhere that Windows keeps where it writes an entry for every time a user logs in/out of a workstation. I've never had the need to know so I can't tell you if this is true or not.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi I have created a menu using Resource.
for example-->
A
and below I want to add one menu named B dynamically.
How to do that.
|
|
|
|
|
CMenu menu;
menu.LoadMenu(IDR_RESOURCEMENU);
CMenu* pContextMenu = menu.GetSubMenu(1);
pContextMenu->InsertMenu(0, MF_STRING | MF_BYPOSITION, ID_LISTMENU_OPEN, _T("&Open"));
pContextMenu->InsertMenu(1, MF_SEPARATOR | MF_BYPOSITION, 0); pContextMenu->SetDefaultItem(0, TRUE);
ID_LISTMENU_OPEN must declared somewhere in your app, as UINT
Hope it help you ...
|
|
|
|
|
<a href="http://www.codeproject.com/Members/flaviu">@Flaviu</a>u
Thanx for the reply
Its not working for me
void CmainWn::OnBZ()
{
// TODO: Add your command handler code here
CMenu menu;
menu.LoadMenuA(IDR_MENU1);
CMenu* pcontextmenu=menu.GetSubMenu(0);
pcontextmenu->InsertMenuA (0,MF_STRING|MF_BYPOSITION,ID_SHOW,_T("&Open"));
pcontextmenu->InsertMenuA(1,MF_SEPARATOR|MF_BYPOSITION,0);
pcontextmenu->SetDefaultItem(0,TRUE);
}
I added this code on the event handler of menu Z which is under menu B at location 0.
But it is not working for me.
My objective is here is on the click of menu Z one menu should be added in my main menu(IDR_MENU1) named as A
Correct me If I am wrong somewhere.
|
|
|
|
|
You should explain better: what you call "Menu Z" ? If I understand well, you have a resource menu, IDR_MENU1, where you want to add dynamically an menu item, ID_SHOW ... I am right ?
P.S. If you post code, use tag ...
|
|
|
|
|
<a href="http://www.codeproject.com/Members/flaviu">@Flaviu</a>u
I have defined Menu Z its entry in resource file is
ID_B_Z .
Yes you are right I am having a resource menu IDR_MENU1 where I want to add a menu named ID_SHOW dynamically.
I just want to know what is wrong with my code ?
|
|
|
|
|
How you defined ID_SHOW ?
|
|
|
|
|
@Flaviuu
Yes I have defined it in my Resource.h file like this.
#define ID_SHOW 107
|
|
|
|
|
Use CMenu::InsertMenuItem that allows you to insert a menu item, an image, a submenu or whatever you want. See[^].
|
|
|
|
|
Thakur JAI SINGH wrote: But it is not working for me. What specifically is not working? You have 5 statements here. Have you stepped through each one using the debugger to see which one is not working as expected?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
So I have a thread, thread one, that writes a byte (an ACK) to a COM port (COM over USB), then sets an event, and a thread, thread two, that's waiting on that event with WaitForSingleObject, INFINITE, which then writes 7 bytes to the port, then goes back to waiting again. Thread one, then reads data from the port, and when its got the whole chunk, writes the ACK, sets the event, and so it goes round again. ad infinitum.
Now I have a USB analyser on the wire, so I can see the timing here, between the one byte ACK going out, and the 7 bytes of data, and it is sometimes 4 seconds!
4 seconds? One thread does a SetEvent, and the other thread, doing a WaitForSingleObject takes 4 seconds to get notified?
Dont believe me?
613 . 0x06 8 2/23/2015 5:52:20.593552 PM
614 .ABCD.. 0x02 58 56 45 52 03 1a 14 2/23/2015 5:52:24.094321 PM
See, almost 4 seconds, that's the USB sniffer trace. What the hells going on?
Just seen one trace go by, and its 8 seconds!
I mean, cant MSFT tighten it up a bit? This is appaling!
( By the way, the driver is mine, and the time between the IRP_MJ_WRITES of 1 byte, and 7 bytes, also reflects the large gaps seen on the USB bus. The driver traces when its hit by the app calling WriteFile() so its not a problem in the driver either, it really is the thread scheduling. )
|
|
|
|
|
If this were true, there would be A LOT of very slow programs out there.... you likely have some other bug in the code. Signaling should be pretty fast.
You'll need to post some source if you want any help though...
|
|
|
|
|
Event created thus:
WriteTrigger = CreateEvent(NULL, FALSE, FALSE, "arse");
This is the write thread (yeah, its MFC):
AFX_MANAGE_STATE(AfxGetStaticModuleState());
while(pDlg->Go)
{
if(!WriteFile(gh, buf, towrite, &written, 0))
{
pDlg->doerror();
}
WaitForSingleObject(pDlg->WriteTrigger, INFINITE);
}
Here is the read thread:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
while(pDlg->Go)
{
ReadFile(gh, buf, 1024 - readTot, &read, 0);
... process data, snipped
WriteFile(gh, &ACK, 1, &written, 0);
SetEvent(pDlg->WriteTrigger);
}
As you can see, its very very simple and I cant see any reason for the often massive delays. As I said, my driver traces the incoming reads and writes off the app aswell, and it confirms that the delay is in usermode.
Albert Holguin wrote: If this were true, there would be A LOT of very slow programs out there....
Er, ever used Windows 7?
Seriously though, I have been writing Windows kernel drivers, and using MFC to write test apps, and utilities for that entire time too. I have written all sorts of threaded code in the Kernel, and never seen any delays like this using KeWaitforSingleObject and KeSetEvent.
It just looks like really crap user mode thread scheduling (this is win 7 64, the app is win32).
|
|
|
|
|
It looks like a design error. You use a blocking ReadFile call. It would be better to use overlapping reads or wait for data available. Overall I would use only one thread (which should be a worker thread):
Thread loop:
Write data to trigger receiption
Read data overlapped
When ReadFile returns ERROR_IO_PENDING
Wait for completion
Process data
Write ACK
Optional short wait time (may also check for a thread kill event)
To report errors occuring in the worker thread you can send user defined messages to your main (GUI) thread.
Similar when data processing requires some GUI output or is performed by another thread (then set an event when processing is finished and wait for it at the end of the communication thread).
|
|
|
|
|
No no no no no.
Read what I wrote. The time lag between the writefile in one thread, and the writefile in the other often exceeds 4 seconds, and the only thing happening between them is a setevent and a thread schedule.
By the way overlapped IO is not as quick as direct, and the fact I have threads obviates the need for it anyway.
|
|
|
|
|
You should show all applicable code (CreateEvent, thread initialization, any other code in the threads).
Munchies_Matt wrote: Er, ever used Windows 7?
I've been working with high-speed software for about a decade. In both Windows and Linux.
Munchies_Matt wrote: It just looks like really crap user mode thread scheduling (this is win 7 64, the app is win32).
No, it's not. You have another issue. As was already mentioned, it is likely one of the other blocking calls you're making. You can easily set up a test to see how fast events are triggered and release waits with a timer. You'll find it's not very long.
|
|
|
|
|
Albert Holguin wrote: You should show all applicable code (CreateEvent, thread initialization, any other code in the threads).
I gave you the CreateEvent code, there aren't any other threads (except for the main thread, the event is not waited on or used anywhere else than shown, and the thread initialisation is with the usual CreateThread() call:
trHR = CreateThread(NULL,0, &ThreadReadProc, this, 0, 0);
Albert Holguin wrote: You have another issue. As was already mentioned, it is likely one of the other blocking calls you're making
As I told the other guy, no, this isn't that case. As you can see from the code the read file completes, a write file is done, and an event signalled. The waiting thread only does a write file.
How much more simply can it be explained to you? You have seen the code, and moving the second write file into the same thread as the first write file results in no delay at all demonstrating that the fault lies in the thread scheduling.
I also don't need a timer to tell me anything, I have a USB bus analyser running and tracing from my driver thats telling me its taking over 4 seconds for the waiting thread to get scheduled.
|
|
|
|
|
Munchies_Matt wrote: How much more simply can it be explained to you? You have seen the code, and moving the second write file into the same thread as the first write file results in no delay at all demonstrating that the fault lies in the thread scheduling.
You're the one that needs help, not us. I suggest you listen to suggestions and think about them instead of being negative.
Munchies_Matt wrote: I have a USB bus analyser running and tracing from my driver thats telling me its taking over 4 seconds for the waiting thread to get scheduled
That's telling you there's problems in your code, not that there's problems with the thread handling in Windows.
|
|
|
|
|
Albert Holguin wrote: You're the one that needs help
No I don't. Just pointing out the crap that is Microsoft.
|
|
|
|
|
Then why are you posting this to Q&A?
I can tell you that signaling isn't slow, you have something wrong with your code... but you somehow refuse to listen. I suggest you set up a test scenario and figure out what's wrong with your code before blaming something that's been around and widely used for years.
|
|
|
|
|
Dot you think that well inside 4 to 8 seconds the thread with the read file should get de-scheduled and the one with the write file scheduled within a reasonable time of the wait being satisfied?
Clearly it isn't. That's the problem. I shouldn't have to put the read file thread to sleep, it should be descheduled automatically.
|
|
|
|
|
Oh, and I just put the code into one thread, which removes the wait and set event, and it runs without any delay at all, of course.
modified 24-Feb-15 6:11am.
|
|
|
|
|
Do you have the read and write calls reading/writing from the same place? ...you probably have a thread deadlock most of the time.
|
|
|
|
|
You have seen the code I supplied, it really is as simple as it looks:
There are two write files, in two different threads.
Both are synchronous write files.
When the first write file completes it and sets an event and goes into a read cycle.
The second write file is in a thread waiting for the event to get signalled.
The time between the two write files is often many seconds. What is happening during that time is a setevent and a wait being satisfied.
|
|
|
|
|