Vinnaren i pepparkakshustävlingen!
2010-05-20, 15:04
  #1
Medlem
mrPythons avatar
Hur får jag stopp på följande program genom att trycka på valfri tangent?

OS är VISTA.

Kod:
## #!/usr/local/bin/python

import ImageGrab
import time
import os
from win32api import GetSystemMetrics
from threading import Timer

width 
GetSystemMetrics (0)    # get screen width and height
height GetSystemMetrics (1)

myRun True

#################

# diverse funktioner samt

def myMainLoop():
    
0
    
while myRun == True:
       
1
       
# och lite annat...

#########

myMainLoop()

# diverse önskvärd uppstädning följer här 

Det går ju förstås att stoppa brutalt och okontrollerat med Ctrl-C, dock utan någon "uppstädning"!

Tacksam för svar innan allt hår är bortrivet i förtvivlan...
Citera
2010-05-20, 17:17
  #2
Medlem
SSHs avatar
Citat:
Ursprungligen postat av mrPython
Hur får jag stopp på följande program genom att trycka på valfri tangent?

OS är VISTA.

Kod:
## #!/usr/local/bin/python

import ImageGrab
import time
import os
from win32api import GetSystemMetrics
from threading import Timer

width 
GetSystemMetrics (0)    # get screen width and height
height GetSystemMetrics (1)

myRun True

#################

# diverse funktioner samt

def myMainLoop():
    
0
    
while myRun == True:
       
1
       
# och lite annat...

#########

myMainLoop()

# diverse önskvärd uppstädning följer här 

Det går ju förstås att stoppa brutalt och okontrollerat med Ctrl-C, dock utan någon "uppstädning"!

Tacksam för svar innan allt hår är bortrivet i förtvivlan...
När Ctrl-C trycks så genereras ett KeyboardInterrupt. Du kan fånga det för att göra uppstäddning.
Kod:
import ImageGrab
import time
import os
from win32api import GetSystemMetrics
from threading import Timer

# get screen width and height
width GetSystemMetrics(0)
height GetSystemMetrics(1)

myRun True

def myMainLoop
():
    
0
    
while myRun:
        
1
        
# och lite annat...

if __name__ == '__main__':
    try:
        
myMainLoop()
    
except KeyboardInterrupt:
        
# diverse önskvärd uppstädning följer här
        
pass 
Alternativ kan du ha try och catch inne i din main-funktionen vilket underlättar om du har en massa lokala variabler som måste användas.
Kod:
import ImageGrab
import time
import os
from win32api import GetSystemMetrics
from threading import Timer

# get screen width and height
width GetSystemMetrics(0)
height GetSystemMetrics(1)

myRun True

def myMainLoop
():
    try:
        
0
        
while myRun:
            
1
            
# och lite annat...
    
except KeyboardInterrupt:
        
# diverse önskvärd uppstädning följer här
        
pass

if __name__ == '__main__':
    
myMainLoop() 
__________________
Senast redigerad av SSH 2010-05-20 kl. 17:45.
Citera
2010-05-20, 18:57
  #3
Medlem
SSHs avatar
Du importerar Timer från threading. Använder du den någonstans? Det är ofta problematiskt att kombinera signalhantering med trådar. I dokumentationen för thread (inte threading) står det:
Citat:
Threads interact strangely with interrupts: the KeyboardInterrupt exception will be received by an arbitrary thread. (When the signal module is available, interrupts always go to the main thread.)

Finns också en intressant video där fenomenet nämns:
http://blip.tv/file/2232410
__________________
Senast redigerad av SSH 2010-05-20 kl. 19:06.
Citera
2010-05-20, 21:23
  #4
Medlem
mrPythons avatar
Tack SSH,

Din första version fungerar klockrent!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback