views:

98

answers:

2

I have a TThread which receives and sends to a device on a COM port. After I read the data, I want to activate the GUI (not in the same thread) using Synchronize(function name). However, when I call the GUI's form function to perform a button click, I get an access violation. I checked to see if the form's value is null and it is not, since this would be an obvious reason for access violation. Right now, I am setting global flags and using a timer that continuously checks to see if a certain condition is met and if so, then I fire off the button click event in that form. That seems to be the only way to avoid getting the access violation.

I really don't like timers so is there a way to avoid having to use a timer on the form?

A: 

You can post a message to the window in question. The timer works in a similar manner. It just fires off a windows message inside the form. You obviously have a handle to the window.

CWnd::PostMessage(...) Don't use send message, it gets processed inline and could cause your thread to stop working.

Typically when you have a worker thread that attempts to access Guithread, they conflict. It's been a while since I've used MFC and threading but that's what I remember. I believe it's documented to work that way.

baash05
Builder5 uses VCL so it is a little different than MFC.
0A0D
A: 

I found the problem. I thought I was checking if my Form was null, but I was not. I fixed it making sure the form I was referencing is not null.

Edit: Turns out that one of the forms that is called when I call Fbutton1Click() is Modal so it blocks my thread. I ended having to go back to a timer to call the button click instead.. oh well.

0A0D