Nov 09 17:53:49 (GR|phish) still don't get this _beginthreadex stuff :< Nov 09 17:54:36 (@Aaron[]) How come? Nov 09 17:54:44 (GR|phish) i just don't understand it. Nov 09 17:54:51 (GR|phish) it shows how to use it. Nov 09 17:55:04 (GR|phish) i just can't seem to figure out how to.. Nov 09 17:55:12 (GR|phish) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__beginthread.2c_._beginthreadex.asp Nov 09 17:56:50 (@Aaron[]) I don't see the problem? Nov 09 17:56:51 (@Aaron[]) lol Nov 09 17:56:57 (@Aaron[]) It's pretty straight forward. Nov 09 17:57:07 (@Aaron[]) You call that function and it gives you a thread pointer. Nov 09 17:57:09 (@Aaron[]) You just plug in arguements. Nov 09 17:57:18 (GR|phish) yeah Nov 09 17:57:22 (GR|phish) you get it. Nov 09 17:57:25 (@Aaron[]) lolol. Nov 09 17:57:31 (@Aaron[]) uintptr_t _beginthread( Nov 09 17:57:31 (@Aaron[]) void( __cdecl *start_address )( void * ), Nov 09 17:57:31 (@Aaron[]) unsigned stack_size, Nov 09 17:57:31 (@Aaron[]) void *arglist Nov 09 17:57:31 (@Aaron[]) ); Nov 09 17:57:38 (GR|phish) i don't cause i'm a fucking nubski and i don't get it,. Nov 09 17:57:50 (@Aaron[]) What you'll want to do is make a function that will be called to start your thread. Nov 09 17:58:03 * Ranek has quit (Ping timeout) Nov 09 17:58:04 (GR|phish) ok Nov 09 17:58:12 (@Aaron[]) It has to be declared a special way though. Nov 09 17:58:48 (@Aaron[]) void __cdecl threadStart(void * params) { } Nov 09 17:58:49 (@Aaron[]) Like that. Nov 09 17:59:06 (GR|phish) ok Nov 09 17:59:07 (GR|phish) well Nov 09 17:59:18 (@Aaron[]) Do you understand the concept at least? Nov 09 17:59:18 (GR|phish) let's say i have a function called Func1() Nov 09 17:59:24 (GR|phish) i'm trying to. Nov 09 17:59:31 (@Aaron[]) Ok ok let me interject first. Nov 09 18:00:04 (@Aaron[]) What a thread is going to do is let you branch off your execution so things will be running in parallel. Nov 09 18:00:09 (GR|phish) yes Nov 09 18:00:12 (coKe) GR|phish: look up calling conventions Nov 09 18:00:15 * BradJ has quit (Ping timeout) Nov 09 18:00:18 (@Aaron[]) So you use beginThread to launch a function in a seperate thread right. Nov 09 18:00:25 (GR|phish) yes Nov 09 18:00:31 (@Aaron[]) And then your original code path continues in it's own thread. Nov 09 18:00:48 (@Aaron[]) So you get that concept. Nov 09 18:00:51 (GR|phish) yes Nov 09 18:01:08 (GR|phish) beginthread -> makes my code in a new thread. Nov 09 18:01:12 (@Aaron[]) Nothing else to get. Throw together your threaded part of your application starting with that function prototype I gave you. Nov 09 18:01:31 (GR|phish) ok Nov 09 18:01:37 (@Aaron[]) Call the function at an appropriate time and start learning about thread management through trial and failure :D Nov 09 18:09:29 (GR|phish) Hmm Nov 09 18:09:59 (GR|phish) what do i do with: Nov 09 18:09:59 (GR|phish) unsigned stack_size, Nov 09 18:09:59 (GR|phish) void *arglist Nov 09 18:10:28 (GR|phish) i've called the functions with __cdecl Nov 09 18:11:11 (@Aaron[]) arglist Nov 09 18:11:12 (@Aaron[]) Argument list to be passed to a new thread or NULL. Nov 09 18:11:25 (@Aaron[]) If you want you can void* some data you might like in your threaded application. Nov 09 18:11:42 (@Aaron[]) So you don't have to resort to thread-unsafe global data in order to communicate with your stuff. Nov 09 18:11:51 (@Aaron[]) stack_size Nov 09 18:11:51 (@Aaron[]) Stack size for a new thread or 0. Nov 09 18:11:57 (@Aaron[]) Just give it 0, it'll alloc you default stack size. Nov 09 18:12:00 (@Aaron[]) And that will be plenty. Nov 09 18:12:16 (@Aaron[]) Also. Nov 09 18:12:22 (@Aaron[]) You realize that you don't actually call the function you made. Nov 09 18:12:29 (@Aaron[]) But pass it in as a parameter to beginThread right? Nov 09 18:13:34 (GR|phish) eh Nov 09 18:13:52 (@Aaron[]) So for example. Nov 09 18:13:56 (@Aaron[]) You make a function: Nov 09 18:14:03 (@Aaron[]) void __cdecl threadStart(void * params) { Nov 09 18:14:11 (@Aaron[]) .//stuff Nov 09 18:14:11 (@Aaron[]) } Nov 09 18:14:18 (@Aaron[]) Then when you call beginthread it should look like: Nov 09 18:14:55 (@Aaron[]) uintptr_t threadid = _beginThread( threadStart, 0, 0 ); Nov 09 18:17:08 (GR|phish) 40 C:\dev\main.cpp `_beginThread' was not declared in this scope Nov 09 18:18:04 (coKe) don't think he knows about function pointers Nov 09 18:18:04 (@Aaron[]) Did you #include Nov 09 18:18:05 (@Aaron[]) ? Nov 09 18:18:17 (GR|phish) yes Nov 09 18:18:26 (@Aaron[]) What compiler are you using? Nov 09 18:18:32 (GR|phish) dev-c++ Nov 09 18:18:38 (GR|phish) i have msvisc++ ee Nov 09 18:18:46 (@Aaron[]) You have to ensure that you're compiling for multithreaded applications. Nov 09 18:19:16 (GR|phish) how? Nov 09 18:19:19 (@Aaron[]) The compiler switch on MS compilers is /MT instead of /ST, I'm not sure what it will be for yours. Nov 09 18:19:22 (@Aaron[]) Try project options. Nov 09 18:19:24 (@Aaron[]) Compiler options. Nov 09 18:19:26 (@Aaron[]) Anything you can find. Nov 09 18:19:44 (@Aaron[]) You might need to delve into the documentation for your compiler. Nov 09 18:19:51 (@Aaron[]) coKe: I'm pretty sure he doesn't. Nov 09 18:20:00 (@Aaron[]) In other news. My moving window works. Nov 09 18:20:00 (GR|phish) dev uses g++ Nov 09 18:20:01 (@Aaron[]) ;D Nov 09 18:20:09 (coKe) screenshots Nov 09 18:20:19 (coKe) LOL, how'd you figure it out Nov 09 18:20:31 (@Aaron[]) I found a weird parameter that didn't look right. Nov 09 18:20:38 (@Aaron[]) Changed it in the SetWindowPos function. Nov 09 18:20:48 (@Aaron[]) Now it's behaving funny. Nov 09 18:20:50 (coKe) lol Nov 09 18:20:52 (@Aaron[]) But it's better than not at all. Nov 09 18:20:53 (@Aaron[]) IMO Nov 09 18:22:15 * Aaron[] has quit (Read error: Connection reset by peer) Nov 09 18:23:18 (GR|phish) lol he crashed irc again.. Nov 09 18:24:22 (coKe) that would be the funny behavior Nov 09 18:25:00 (GR|phish) well it doesn't help me figure this stuff out Nov 09 18:25:07 (GR|phish) i get `_beginThread' was not declared in this scope Nov 09 18:25:17 (GR|phish) i got -mthread defined in the compiler options Nov 09 18:25:41 (GR|phish) and my code it [ uintptr_t threadid = _beginThread( Game, 0, 0 ); ] Nov 09 18:25:44 * Aaron[] (~aaronl_d@d206-75-28-126.abhsia.telus.net) has joined #C++ Nov 09 18:25:45 * ChanServ gives channel operator status to Aaron[] Nov 09 18:25:51 (@Aaron[]) Man I get some wicked crashes with this thing. Nov 09 18:25:53 (@Aaron[]) lmao Nov 09 18:25:54 (GR|phish) Game being an actual fuction called with __cdecl Nov 09 18:25:54 (@Aaron[]) coKe! Nov 09 18:26:05 (@Aaron[]) Uh what phish? Nov 09 18:26:12 (GR|phish) i get `_beginThread' was not declared in this scope Nov 09 18:26:13 (GR|phish) i got -mthread defined in the compiler options Nov 09 18:26:13 (GR|phish) and my code it [ uintptr_t threadid = _beginThread( Game, 0, 0 ); ] Nov 09 18:26:30 (@Aaron[]) Why is your code in []? Nov 09 18:26:40 (GR|phish) just to make it clearer Nov 09 18:26:47 (@Aaron[]) Does that even work? Nov 09 18:26:50 (@Aaron[]) I've never tried it. Nov 09 18:26:59 (Andrew-) i think he just means for irc :p Nov 09 18:27:05 (GR|phish) lol, andrew has it. Nov 09 18:27:08 (@Aaron[]) Oh ok. Nov 09 18:27:09 (@Aaron[]) lol. Nov 09 18:27:16 (@Aaron[]) Does it work then GR|phish? Nov 09 18:27:21 (GR|phish) neg Nov 09 18:27:25 (@Aaron[]) What's wrong now? Nov 09 18:27:35 (GR|phish) DEV keeps saying `_beginThread' was not declared in this scope Nov 09 18:27:53 (@Aaron[]) Did you #include Nov 09 18:27:54 (@Aaron[]) ? Nov 09 18:28:01 (@Aaron[]) Might crash here hold on. Nov 09 18:28:05 (GR|phish) yes i did. Nov 09 18:28:05 * Aaron[] has quit (Read error: Connection reset by peer) Nov 09 18:28:09 (Andrew-) ha Nov 09 18:28:15 * Aaron[] (~aaronl_d@d206-75-28-126.abhsia.telus.net) has joined #C++ Nov 09 18:28:16 * ChanServ gives channel operator status to Aaron[] Nov 09 18:28:31 (GR|phish) i did include process.h Nov 09 18:28:55 (@Aaron[]) Hm. Nov 09 18:29:00 (@Aaron[]) I'm unsure why it would be undefined then... Nov 09 18:29:33 (GR|phish) well Nov 09 18:29:38 (GR|phish) i tried _beginthread Nov 09 18:29:44 (GR|phish) with the capitol T Nov 09 18:29:46 (GR|phish) and i got Nov 09 18:29:50 (GR|phish) 40 C:\dev\main.cpp invalid conversion from `void (*)()' to `void (*)(void*)' Nov 09 18:29:53 (@Aaron[]) Oh. Nov 09 18:29:55 (GR|phish) 40 C:\dev\main.cpp initializing argument 1 of `long unsigned int _beginthread(void (*)(void*), unsigned int, void*)' Nov 09 18:29:56 (@Aaron[]) Yeah it has no capital t. Nov 09 18:29:57 (@Aaron[]) Kekeke. Nov 09 18:30:05 (@Aaron[]) :$ Nov 09 18:30:22 (@Aaron[]) There's something wrong with your function. Nov 09 18:30:55 (@Aaron[]) Show me your stuff again please. Nov 09 18:31:05 (@Aaron[]) I may crash here hold on. Nov 09 18:31:16 (@Aaron[]) FUCKING RIGHT Nov 09 18:31:18 (@Aaron[]) coKe: I GOT IT Nov 09 18:31:21 (GR|phish) kk, do you mind if i paste 7lines of code? Nov 09 18:31:22 (@Aaron[]) IT'S TERRIBLE BUT I GOT IT. Nov 09 18:31:25 (GR|phish) lol Nov 09 18:31:26 (@Aaron[]) No I don't give a crap. Nov 09 18:31:28 (GR|phish) void __cdecl Game(void) Nov 09 18:31:29 (GR|phish) { Nov 09 18:31:29 (GR|phish) cout << "Welcome to the Game" << endl; Nov 09 18:31:29 (GR|phish) cout << "Please enter your name: " << endl; Nov 09 18:31:29 (GR|phish) cin >> FakeName; Nov 09 18:31:30 (GR|phish) cout << "Alright " << FakeName << " Please wait as the game loads" << endl; Nov 09 18:31:32 (GR|phish) } Nov 09 18:31:48 (@Aaron[]) void __cdecl Game(void * params) Nov 09 18:31:52 (@Aaron[]) That's what it should be. Nov 09 18:32:00 (@Aaron[]) You have to have the void * in there. Nov 09 18:32:18 (@Aaron[]) Because it's actually how the function required by _beginthread is expected you know? Nov 09 18:32:29 (@Aaron[]) I know it's hard for you to know what I'm talking about because you don't understand function pointers. Nov 09 18:32:31 (@Aaron[]) But that's how it is. Nov 09 18:32:32 (@Aaron[]) -_- Nov 09 18:32:47 (GR|phish) keke Nov 09 18:32:55 (GR|phish) tew few freaking functions.. Nov 09 18:32:59 (GR|phish) i mean Nov 09 18:33:01 (GR|phish) uhm... Nov 09 18:33:10 (GR|phish) to few arguments! Nov 09 18:33:15 (GR|phish) that's what i mean Nov 09 18:33:17 (@Aaron[]) !? Nov 09 18:33:18 (Andrew-) ;\ Nov 09 18:33:25 (GR|phish) void __cdecl Game(void * params) Nov 09 18:33:37 (@Aaron[]) Yes. Nov 09 18:34:02 (Andrew-) works for me in dev-cpp ;o Nov 09 18:34:48 (@Aaron[]) Does GDI support double buffering? Nov 09 18:34:54 (@Aaron[]) If so where the hell do I find it. This thing flickers like a whore. Nov 09 18:36:11 (GR|phish) oh my gawd Nov 09 18:36:15 (GR|phish) i gotzd it. Nov 09 18:36:53 (GR|phish) problem was i wasn't putting [ uintptr_t threadid = _beginthread( Game, 0, 0 ); ] in the main function Nov 09 18:37:02 (Andrew-) =/ Nov 09 18:37:12 (Andrew-) where did you have it? Nov 09 18:37:18 (GR|phish) before int main() Nov 09 18:37:30 (GR|phish) and i had Game(); being called inside main(); Nov 09 18:37:40 (@Aaron[]) Yea don't do that. Nov 09 18:37:48 (GR|phish) you never told me >_> Nov 09 18:37:59 (GR|phish) but none the less Nov 09 18:38:02 (GR|phish) i gotta thank you. Nov 09 18:38:05 (@Aaron[]) :D Nov 09 18:38:46 (GR|phish) but Nov 09 18:39:02 (GR|phish) in [ _beginthread( Game, 0, 0 ); ] Nov 09 18:39:12 (GR|phish) what are the 0, 0's for? Nov 09 18:39:17 * Knio1 (~Knio@66.222.174.231) has joined #C++ Nov 09 18:39:17 * ChanServ gives channel operator status to Knio1 Nov 09 18:39:41 (@Aaron[]) The first 0 designates stack size. Nov 09 18:39:54 (@Aaron[]) If you know what a stack for a program or a thread is you'll understand what I mean. Nov 09 18:39:57 (@Aaron[]) If not, don't worry about it. Nov 09 18:40:00 (GR|phish) ok Nov 09 18:40:05 (@Aaron[]) By passing 0 you're telling Windows to give you default stack size for a thread. Nov 09 18:40:11 (GR|phish) i can't wait till my books come here. Nov 09 18:40:15 (GR|phish) it will be much easier. Nov 09 18:40:27 (@Aaron[]) The last 0 is parameters. You know that parameter in your Game function? void * params? Nov 09 18:40:42 (@Aaron[]) If you wanted to, you could say pass a string, or a struct into that last 0 Nov 09 18:40:44 (@Aaron[]) Like this: Nov 09 18:40:57 (@Aaron[]) _beginthread( Game, 0, (void*)&myStruct ); Nov 09 18:41:02 (@Aaron[]) And then in your game function you could do this: Nov 09 18:41:09 (@Aaron[]) void __cdecl Game(void * params) { Nov 09 18:41:10 * Knio has quit (Ping timeout) Nov 09 18:41:35 (@Aaron[]) MYSTRUCTTYPE * myStruct = (myStruct*)params; Nov 09 18:41:39 (@Aaron[]) And voila. Nov 09 18:41:49 (GR|phish) some jibberish :P Nov 09 18:41:51 (@Aaron[]) You've pushed your data through from the main program into your threaded application. Nov 09 18:41:58 (GR|phish) oh Nov 09 18:41:59 (GR|phish) i see Nov 09 18:42:22 (GR|phish) so if i had some varible in the main function Nov 09 18:42:33 (GR|phish) i could use it in the threaded function Nov 09 18:42:55 (@Aaron[]) Yes. Nov 09 18:43:02 (GR|phish) neat Nov 09 18:43:07 (@Aaron[]) You could use it by assigning global variables, but they aren't guaranteed to be thread-safe. Nov 09 18:43:10 (@Aaron[]) So it's not a good idea. Nov 09 18:43:21 (@Aaron[]) That's why they give you the option to pass parameters or "params" ;) Nov 09 18:43:25 (GR|phish) :o Nov 09 18:43:31 (GR|phish) how can it not be thread-safe? Nov 09 18:43:37 (GR|phish) will it cause a memory leak? Nov 09 18:43:42 (@Aaron[]) Well you see GR|phish... threads do funny things in programs. Nov 09 18:43:47 (@Aaron[]) Suppose we have a variable that's shared. Nov 09 18:43:57 (@Aaron[]) Let's for sake of nonsense call it: int race; Nov 09 18:44:02 (GR|phish) k Nov 09 18:44:09 (@Aaron[]) Now, say the main thread wants to assign race to equal 5. Nov 09 18:44:21 (@Aaron[]) But in the same processing time slice, the second thread wants to assign race to equal to 6. Nov 09 18:44:38 (@Aaron[]) When both threads are done assigning. What number is it actually? Nov 09 18:44:45 (GR|phish) 5.5? Nov 09 18:45:00 (@Aaron[]) Or... what happens if thread A changes it, while thread B is doing a critical read on it? Nov 09 18:45:08 (GR|phish) hmm Nov 09 18:45:09 (@Aaron[]) Where more than a few functions use this "race". Nov 09 18:45:19 (@Aaron[]) Then all of a sudden, mid-calculation... your variable changes. Nov 09 18:45:28 (@Aaron[]) That is what not being thread-safe means. Nov 09 18:45:37 (GR|phish) oh ok Nov 09 18:45:59 (GR|phish) and this way "copies" the varible into the new thread Nov 09 18:46:12 (@Aaron[]) Yes exactly. Nov 09 18:46:16 (GR|phish) oh ok