|
Actually the problem was related to the way of copying from srcHDC to ImageHDC. I have done like this:
HDC svgDC = cairo_win32_surface_get_dc(surface);
image.Create(width, height, 32);
image.SetHasAlphaChannel(TRUE);
HDC imageHDC = image.GetDC();
BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(imageHDC, 0, 0, width, height, svgDC, 0, 0, width, height, blend);
image.ReleaseDC();
Best regards!
|
|
|
|
|
|
When? How?
Sidenote: Was this meant to be a question, rant or discussion topic?
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
|
|
He might need it, but I doubt that he can get any decent beer in Iran.
(See the guy's profile)
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
I think he has already had a few too many.
Speed of sound - 1100 ft/sec
Speed of light - 186,000 mi/sec
Speed of stupid - instantaneous.
|
|
|
|
|
Hi
I am new to VC++/MFC but have C++ background.
I am using addpage() of CPropertySheet class to add new tabs. My problem is that on click of a radiobutton control all tab pages should be disable except one.
How to solve it?
Vivek
|
|
|
|
|
This is how I've done it when the need arises.
"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
|
|
|
|
|
Anybody can please provide the solution?
|
|
|
|
|
I sent you a link to a working solution. I've used it in several projects.
"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
|
|
|
|
|
VS2008 unicode mfc project. Heavy use of CString variables. Other than the HMI display of text to the user, all other text is english. So, I might have something like this:
CString stmp;
stmp.Format(_T("%s"), _T("192.168.0"));
displaying in the debugger: stmp.m_pszData ---- 192.168.0
other times, I'll get what I guess is the unicode version --- 㤱⸲㘱⸸⸰
Anyone seen this weird behavior? I can run the program multiple times, and it seems like the debugger's presentation can change. I've not found the pattern yet.
Charlie Gilley
<italic>Stuck in a dysfunctional matrix from which I must escape...
"Where liberty dwells, there is my country." B. Franklin, 1783
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
|
|
|
|
|
Have you tried %S instead?
"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
|
|
|
|
|
Darn, someone responded before I could delete my silly post. I'm converting strings incorrectly (most of the IP work on Windows uses char and now wchar_t. So, self inflicted injury.
Charlie Gilley
<italic>Stuck in a dysfunctional matrix from which I must escape...
"Where liberty dwells, there is my country." B. Franklin, 1783
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
|
|
|
|
|
Hi,
I am sure this is right but I am having a hell of time debugging a multithreading application
When executing the same code/functions each thread has its own set of registers and local
Variables
Thanks
|
|
|
|
|
Yes, each thread has its own stack (local variables), registers, and "thread-local-storage". Static and global variables are common to all threads.
This is what makes multithreaded programming such a joy...
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
This is, despite the title, not really a question.
Clearly there will be multiple threads yes, that's the point.
What do you want to know?
|
|
|
|
|
Yes, just the same as MVS and VM programs.
|
|
|
|
|
The problem is the breaking the debugger doesn't stop the system clocks on the PC which means you get a backlog and out of sequence queue of things to happen when you release the debug. So often your debugging does not look like the system when running which can be more than a little frustrating
There is an extension that helps
GitHub - mayerwin/vs-debug-single-thread: Debug Single Thread - Visual Studio Extension[^]
But at times it still gets frustrating.
In vino veritas
|
|
|
|
|
If you're familiar with Visual Studio debugging options they include a Task window, Thread window, and a window to view Parallel stacks. All these windows support various flags and the Parallel stacks shows a nice visual diagram of the execution environment. There's also the Tracepoint option if you want a breakpoint that outputs state information but doesn't halt execution.
I don't really see the issue with out of order execution. That should be something addressed in your code with barriers/fences, locks, semaphores, mutexes, or whatever else you use.
|
|
|
|
|
Thanks
The visual studio thread window I know has the ability to freeze a thread
Regardless I'll down load the
Extension
Let me explain the nature of the problem
I'm writting a debugger for another platform
The way I Interrupt the program and show the user the code is by overlaying the instruction which causes a interrupt and allows me to get control
I quickly put back the instruction that was overlayed
However the interrupt gives me control
This all fine when the "Debugged" program is single thread
However in a multi thread program in which other programs use he same code
I get a operation exception
The way I coded this was the as soon as I overlay the instruction I do a Restevent which cause an event to be non- signaled this will cause the other programs to Wait or WaitForSingleEvent until I have chance to put the instruction back and then I do a SetEvent to let execution of the program to the other threads trying to execute it
Something is obviously not working out right in this timing
In Visual Sudio I can observe how QUICKLY the windows dispatcher switches from thread to thread
Thanks
|
|
|
|
|
Lets see if I have got this right
The other threads won't stop until they hit a lock point. So let me imagine they are in the section of code you overlayed. They will see your overlay (which is an interrupt opcode I guess .. you transposed the real opcode out to a hold memory somewhere). However interrupts will be disabled because you are in the IRQ routine already so it then continues thru to next opcode.
I can imagine if that is the scheme you end up with two equally bad situations
1.) the other threads pull an illegal opcode if your transpose isn't the same length as the replaced opcode
2.) they pass thru the overlay missing the held opcode (they saw the interrupt request which was ignored). So anything could happen the thread missed an entire opcode.
If that is what you are doing there is no fix, you either can't have the threads going thru the same code or you need to stop the threads immediately the other threads even advancing one opcode can be fatal much less allowing them to run to next lock point.
This goes back to what I was getting at originally you need to stop the system totally in some schemes. Some processors like Arm and many microcontrollers can do that under system control for hardware debugging. The Raspberry PI which uses an ARM6/7/8 could do that for example. I fear your current schema needs a full hardware debugging setup if I understand it correctly.
Edit: Assuming above is correct I gave this a bit of thought and there is possibly a way to do this on a normal non stepable processor. You have the stacks of the threads and that contains the Program Counter for each thread. So overlay the other threads as well this time with a relative branch instruction to there current position ... get it ... will deadloop them to exactly where they are ... meeting the requirement they don't move even one opcode forward You don't need the event stuff at all it's just a repeat of what you do to the active thread in the interrupt overlaying a different instruction into non active threads. Just make sure you put back the opcodes in reverse order (incase two threads are in the exact same place) from within an interrupt when you want to release it back.
In vino veritas
modified 10-Jan-17 0:55am.
|
|
|
|
|
I am a MainFrame Assembler programmer by trade
this is the emulator
The Hercules System/370, ESA/390, and z/Architecture Emulator[^]
I overlay two bytes of code (causing it to pause) right before I overlay the code I do a ResetEvent which will cause a manual Event to be NON-signaled the threads right behind this will stop on the WaitForSingleObject
I have code to determine the Work unit executing code in CSA (common storage) it is only for that code that I do a ResetEvent and then memcpy
Once the emulated code that I overlayed (cuasing it to interrupt and pause)
I put back the legal opcode via memcpy right after I do a SetEvent for the other workunits executing the common storage to proceed (as it is now okay) and bypass the overlaying logic
I will paste the relevant code shortly as it is late (have to get to sleep)
I wanted to give you a feel (of what I doing) as you have been so verrrrrry helpful
|
|
|
|
|
Make sure you are using manual reset events there is a trap for young players with Auto-Reset Events
Read the documentation
SetEvent function (Windows)[^]
Quote => The state of an auto-reset event object remains signaled until a single waiting thread is released, at which time the system automatically sets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.
In vino veritas
|
|
|
|
|
Hi
before pasting the code let me Clarify NON-signaled would mean a thread executing WaitForSingleObject is suspended
I am still running into problems where other threads are executing the overlayed code
here is the code Initiallly the event is created signaled
sysblk.single_thread = CreateEvent(NULL,TRUE,FALSE,"WaitThread");
/* this block of code checks if the address where the code is executing is within the address looking to be traced and is the address space correct the GET_WU function checks the the task or thread within the address space so GET_WU returns a 64 bit value 32 bits for a address space 32 for the task this is UNIQUE */
if(sysblk.debug_init == 0)
{
if (sysblk.asid != 0)
{
if((shouldstep == 1) && (regs->CR_LHL(4) == sysblk.asid))
{
sysblk.debug_init = 1;
regs->should_step = 1;
sysblk.hercgui_break = 1;
sysblk.hercgui_initbreak = 0; sysblk.debug_wu.D = ARCH_DEP(GET_WU)(regs);
if(IsDebuggerPresent())
{
sprintf(buf,"CPU%4.4X: WU Being Debugged ASCB=%4X,TCB/SRB=%4X \n",regs->cpuad,sysblk.debug_wu.F.H.F,sysblk.debug_wu.F.L.F);
OutputDebugString(buf);
}
}
else
shouldstep = 0;
}
/* the next piece of code checks after the user has examined the code and I have restored the correct instruction I want to let it execute and not over lay stop ia is the instruction address */
// Hercmd is a from end Windows MFC/C++ I have written to display the information
if(regs->psw.ia.D == sysblk.debug_ia.D)
{
wu_ptr.D = ARCH_DEP(GET_WU)(regs);
if(wu_ptr.D == sysblk.debug_wu.D)
{
sysblk.debug_ia.D =0;
if(IsDebuggerPresent())
{
ARCH_DEP(vfetchc)(buf1,5,regs->psw.ia.D,0X00,regs);
sprintf(buf,"CPU%4.4X: inst being executed=%s At address %8X\n",buf1,regs->psw.ia.D);
OutputDebugString(buf);
}
return;
}
}
/* this is the code where I check if other threads are execting the same code and the address or instruction has been overlayed to genarate a pause so I WaitForSingleObject */
if(regs->psw.ia.D == sysblk.debug_ia.D)
{
wu_ptr.D = ARCH_DEP(GET_WU)(regs);
if (wu_ptr.D != sysblk.debug_wu.D)
{
regs->cpustate = CPUSTATE_STOPPED;
dwWaitResult = WaitForSingleObject(sysblk.single_thread,INFINITE);
if(dwWaitResult == -1)
errcd = GetLastError();
if(IsDebuggerPresent())
{
ARCH_DEP(vfetchc)(buf1,4,regs->psw.ia.D,0X00,regs);
FETCH_FW(INST,buf1);
sprintf(buf,"CPU%4.4X: WU Was Held ASCB=%4X TCB/SRB=%4X, AT instruction address %8X inst=%04X\n",regs->cpuad,wu_ptr.F.H.F,wu_ptr.F.L.F,regs->psw.ia.D,INST);
OutputDebugString(buf);
}
return;
}
else
return;
}
// this where I overlay the insruction to stop the CORRECT task
if ((wu_ptr.D = ARCH_DEP(GET_WU)(regs)) == sysblk.debug_wu.D && shouldstep == 1)
{
ResetEvent(sysblk.single_thread); ip = regs->ip < regs->aip ? regs->inst : regs->ip;
ARCH_DEP(display_inst) (regs, ip);
sysblk.debug_inst_count++;
sysblk.stop_ip = regs->ip < regs->aip ? regs->inst : regs->ip;
if(sysblk.debug_overlay[0] == 0x00)
{
ip = regs->ip < regs->aip ? regs->inst : regs->ip;
sysblk.debug_ip = ip;
memcpy((void *)&sysblk.debug_overlay[0],(void *)ip,2);
memcpy((char *)&sysblk.savereg15,(char *)®s->gr[15],8);
memcpy((char *)&sysblk.savereg14,(char *)®s->gr[14],8);
sysblk.debug_ia.D = regs->psw.ia.D;
memcpy((void *)®s->gr[15].F.L.F,(void *)&sysblk.pause_rtn,4);
memcpy((void *)ip,(void *)&BASSM,2);
sysblk.hercgui_debug = 1;
}
regs->is_debugging = 1;
if(IsDebuggerPresent())
{
sprintf(buf,"CPU%4.4X: Inst Modified For ASCB=%4X TCB/SRB=%4X \n",regs->cpuad,wu_ptr.F.H.F,wu_ptr.F.L.F);
OutputDebugString(buf);
}
}
// This the code after the emulated instruction that I overlayed has executed I put back the 1st two bytes of the instruction and do a SetEvent as now other threads can proceed
if((regs->gr[15].F.L.F == sysblk.pause_rtn) && ((void *)sysblk.pause_rtn != NULL))
{
memcpy(sysblk.stop_ip,&sysblk.debug_overlay[0],2);
memcpy((char *)®s->gr[15],(char *)&sysblk.savereg15,8);
memcpy((char *)®s->gr[14],(char *)&sysblk.savereg14,8);
sysblk.debug_overlay[0] = 0x00;
sysblk.debug_overlay[1] = 0x00;
sysblk.hercgui_is_debugging = 0;
regs->bypass_debug = 1;
regs->is_debugging = 0;
regs->should_step = 0;
SetEvent(sysblk.single_thread);
wu_ptr.D = ARCH_DEP(GET_WU)(regs);
if(IsDebuggerPresent())
{
sprintf(buf,"CPU%4.4X: SetEvent for ASCB=%4X TBC/SRB=%4X\n",regs->cpuad,wu_ptr.F.H.F,wu_ptr.F.L.F);
OutputDebugString(buf);
}
}
|
|
|
|
|