|
Joao Vaz wrote:
it took 1º time 25 minutes , and after optimizing only 5 minutes
Ha! So it was actually a pessimization! How did you achieve that? You've only replaced #includes with forward refs??
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Tomasz Sowinski wrote:
So it was actually a pessimization
I said compile time , not run time !!!
Basically , a mixture of pimpl idiom , with changing all graphic widgets to widgets*.
Now, if you think it's weird, I agree with you, we only changed the a special debug version to show up to the rest off the company, we had every single friday a presentation to show the job done since the last week.
So the time it took 25 minutes to compile, achieved that we were late 30 minutes , what didn't do any good to us, I know what I'm talking a about, the project had 3 programmers, including me, the programmer manager wasn't a programmer manager at all , we coded month after month afterhours, we were seen in the company as the black sheep, they didn't do any planning and they said that wasn't needed , so they reformulated week after week the aplicational requirements
The app had more than 100+ screens , hundreds of classes , 120 tables , more than 500 stored procedures(and logaritmic increasing), some extremely complex, like a 1000 lines that I wrote ... and they f***ed expected some <<little changes="">> didn't break the code .
Oh, and more , in the company was forbidden to listen to the music, even with speakers, we were obliged to wear a full suit with a tie, even we never leave to clients, and we unofficially the maintainers of the network for the company, including installing win98 and games to the director ... but they never accounted on this for the delays on our planning,even I losted 2 days on resolving the problems with the network , helping the others employees to do their work that was also very important ...they never gave a f***, they said that was our guilty
Result : we resolve to above solution to decrease compile time, it's so much faster to include the header in the cpp than in the header, much faster indeed
Of course, eleven months after we all resigned and leaved the company to frooze the product
They well deserved
Joao Vaz
|
|
|
|
|
There are some tips discussed in Herb Sutter exceptional and more exceptional C++. Guidelines that may reduce the include hell are:
* use forward delarations. The author stresses the use of #include < iosfwd >
* Avoid unnecesary inheritace. "is implemented in terms of". By encapsulating data members (pointers wrapped in a convenient smart pointer like std::auto_ptr or boost::shared_ptr ).
* The pimpl idiom.
For further details go to www.gotw.ca (lots of C++ good material there) and even better, support the author by buying his book (I'm in no way related to the author, but I do enjoy reading his columns...)
Regards,
R.
|
|
|
|
|
Ramon Casellas wrote:
For further details go to www.gotw.ca (lots of C++ good material there) and even better, support the author by buying his book (I'm in no way related to the author, but I do enjoy reading his columns...)
Very True , a indispensable portal of knowledge to any serious c++ developer .
I've Exceptional C++, but I didn't bought yet The More Exceptional C++
Joao Vaz
|
|
|
|
|
One thing I always do, and I picked this up from reading windoze SDK headers, is I put this little block at the front of all my headers :
#ifdef _HEADER_H
#error repeated include of this file
#else
#define _HEADER_H
#endif
Then substitute the name of your header file in place of HEADER.
Any time I want to include the file I use this :
#ifndef _HEADER_H
#include "Header.h"
#endif
This forces one and only inclusion of a given header file without having to parse each one a whole bunch of times. This really adds up in large projects.
One key to making this work is to have a consistent define pattern for the header files. I always use the one shown. I dislike the GUID method but that's just me.
This is also portable unlike MFC's pragma once method in case that matters.
Another frequent header file headache is the issue of global variables and the use of extern. Here is what I do.
In one central macro definition header define this :
#ifdef _DEFINE_GLOBALS
#define Global
#else
#define Global extern
#endif
Then you can declare global variables like this :
Global int GlobalInteger_1;
Global int GlobalInteger_2;
If you want them initialized then do this :
#ifdef _DEFINE_GLOBALS
int GlobalInteger_1 = 42;
#else // _DEFINE_GLOBALS
Global int GlobalInteger_1;
#endif // _DEFINE_GLOBALS
Prior to include the header with the global declarations, do this :
#define _DEFINE_GLOBALS
#include "Globals.h"
NOTE: the _DEFINE_GLOBALS may only be defined one and only one time. I usually do it in my application class module.
The advantages of this scheme are that you only have to maitain one file of declarations and the extern issue is taken care of.
|
|
|
|
|
Hi
First of all a short description of what I want to do:
I want to start a program (using ShellExecute), then find the only ListBox within the new launched app. I use FindWindow and then EnumChildWindows.
Until now everything works fine, I can get a HWND handle to the ListBox of the other app.
Now I want to select the 2nd item of the single-selection ListBox.
I use
SendMessage(hwnd,LB_SETCURSEL,1,0);
The ListBox definately has at least 2 items and the hwnd handle is correct as well. However, no item is selected, although it should work this way (MFC does it the same way).
If I try
int count = SendMessage(hwnd,LB_GETCOUNT,0,0);
this works, i.e. I can get the numer of items of this ListBox.
Can you explain, why I can't change the selected item?
thanks in advance
Gregor
modified 12-Sep-18 21:01pm.
|
|
|
|
|
LB_SETCURSEL only works for single selection list boxes. If the list box supports multiple selection, use LB_SETSEL instead.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
As I said in my first post this is a single selection listbox
Help Me!
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Ooops sorry, didn't see that!
What's the return value of SendMessage() ? Does it return LB_ERR ?
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
It returns "1".
Dunno what that means but shout mean that item 1 has been selected, right?
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Hmmm, looks like it's doing the right thing.
Have you tried selecting (i.e. setting focus to) the window containing the list box after you do the SendMessage() ? Does it show the highlighted item when you do that?
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
It automatically gets focus after it has been launched through ShellExecute
modified 12-Sep-18 21:01pm.
|
|
|
|
|
I just found a very strange behavior:
If I start my app for the first time, the item does not get selected in the listbox of the app.
But if I start my app for a second time (and therefore my program starts the other program again so that two instances are running), then suddenly the item gets selected, but only in the first (!) instance of the other app.
What's going on?
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Can you use Spy++ to check if your listbox actually receives LB_SETCURSEL?
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
I never used Spy++ before, could you shortly explain where I can check for incoming messages in other applications?
thanks
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Ctrl+F, then drag 'target' icon on the listbox window. You'll be able to choose between examining properties of the window and hooking into its messages.
BTW: you're calling ShellExecute, then immediately follow with SendMessage? Or there's some other event, like button press which is used to invoked SendMessage with LB_SETCURSEL?
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
SendMessage is called within the EnumChildWindows-Callback,which is directly called after ShellExecute. But there's no problem with e.g. LB_GETCOUNT, this works quite well
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Well, while it's not guaranteed to solve your problems, you may try to add WaitForInputIdle call between ShellExecute and EnumChildWindows to avoid dependencies in startup time of second application.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
How do I get a HANDLE of the other app?
Is WaitForInputIdle((HANDLE)wnd,INFINTE) legal?
This did not solve my problems, but you might take a look at my comment "Just found strange behavior" I hope you understand it, my English is not very good
thanks
modified 12-Sep-18 21:01pm.
|
|
|
|
|
No, you can't just use HWND as a process handle. For that you'll need to use ShellExecuteEx or get the handle with a call to GetWindowThreadProcessId/OpenProcess.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
|
Gregor S. wrote:
You are my hero of the month
Stop brown-nosing
BTW: you'll have to change FindWindow to EnumWindows. That's because your app may be started twice, and it may launch two (or more?) apps with ShellExecute. FindWindow will find first HWND with given class/caption - this criteria is too weak if you can have more than one app launched with ShellExecute.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Gregor S. wrote:
you might take a look at my comment "Just found strange behavior"
It looks like synchronization problem. Your 2nd FindWindow call finds the main window launched by 1st ShellExecute call, then sends the message. Message is processed OK and item is selected.
It seems that launched app needs some time before it can accept messages - WaitInputIdle ensures that. Use ShellExecuteEx to avoid problems with mutliple target windows - you'll get the process handle. You'll also have to abandon FindWindow - if two apps were launched, the find criteria are too weak. EnumWindows and GetWindowThreadProcessId are the way to go.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
I need to handle a 2D Array whose first subscript is known to me only at runtime.The Array is an array of strings.The second subscript is the max size of a string.But I want to use only character arrays but not CString to represent a string.
Hence,if I declare an array,like
#define MAX_STRING_SZ 10
char MyArray[][MAX_STRING_SZ+1];
...
and I want to use the above array in a function F1.
F1 will return such arrays , n numbers,to function F2,where The arrays's members are shown in a list view.
But,the array declaration is not allowed in Microsoft Visual C++ to have empty braces[] as well as with any variable,whose value I would supply as and when I get.
I am in urgent need of this.
Thanking you ,The Experts,in advance!!!
Best Regards,
GVBhaskar
srigvb@yahoo.com
srigvb@rediffmail.com
gvbhaskar@hotmail.com
G.V.Bhaskar
|
|
|
|
|
Can't you use CStringArray, CStringList or std::vector<std::string> ?
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|