Threading for observering file content

Threading for observering file content

Anonymous
Not applicable
710 Views
1 Reply
Message 1 of 2

Threading for observering file content

Anonymous
Not applicable

i want to implement a file observing with RevitPythonShell. i got 2 solutions which run perfectly with IronPython but get stacked (Revit closed without any error show up ) when use with PythonRevitShell. Please someone help me to decrypt this fault?

1. Use System IO

 

from System.IO import FileSystemWatcher
from System.Threading import Thread
def onChanged(source, event):
    print 'Changed:', event.ChangeType, event.FullPath
def onRenamed(source, event):
    print 'Renamed:', event.OldFullPath, event.FullPath
watcher = FileSystemWatcher()
watcher.Path = 'D:\\temp'
watcher.Filter = 'test.log'

watcher.Changed += onChanged
watcher.Created += onChanged
watcher.Deleted += onChanged
watcher.Renamed += onRenamed

watcher.EnableRaisingEvents = True 

Thread.Sleep(60 * 1000 * 60) # Revit closed when i add this line

2. Use watchdog python

 

class MyEventHandler(PatternMatchingEventHandler):
    def on_moved(self, event):
        super(MyEventHandler, self).on_moved(event)
        logging.info("File %s was just moved" % event.src_path)

    def on_created(self, event):
        super(MyEventHandler, self).on_created(event)
        logging.info("File %s was just created" % event.src_path)

    def on_deleted(self, event):
        super(MyEventHandler, self).on_deleted(event)
        logging.info("File %s was just deleted" % event.src_path)

    def on_modified(self, event):
        super(MyEventHandler, self).on_modified(event)
        logging.info("File %s was just modified" % event.src_path)

def main(file_path=None):
    logging.basicConfig(level=logging.INFO,
        format='%(asctime)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S')
    watched_dir = os.path.split(file_path)[0]
    print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir)
    patterns = [file_path]
    print 'patterns = {patterns}'.format(patterns=', '.join(patterns))
    event_handler = MyEventHandler(patterns=patterns)
    observer = Observer()
    observer.schedule(event_handler, watched_dir, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

if __name__ == "__main__":
    main(log_path)              

 

 

0 Likes
Accepted solutions (1)
711 Views
1 Reply
Reply (1)
Message 2 of 2

jeremytammik
Autodesk
Autodesk
Accepted solution

The Revit API does not support multi-threading:

 

http://thebuildingcoder.typepad.com/blog/2014/11/the-revit-api-is-never-ever-thread-safe.html



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

0 Likes