All work done on our project is subject to peer review. Any code submitted to the version control system, must have an accompanying “change request” which has a unique number. The reviews are done “incrementally”. That is, “diffs” are compared to ensure the changes are correct. (Or at least, that’s the theory!)
To help facilitate this, a Delphi client application was written to access the information necessary. The diffs are stored as HTML files (generated by a server side application) which an embedded Web browser control displays. An external “diff tool” can be used for more powerful operations than the web browser allows. Although in theory, a normal web-browser could be used to perform the review, the HTML diff files are limited in their user-friendliness and non-trivial changes end up being examined by the external diff tool.
The problem I have, is that I work in a remote office to where the “server” is. Network latency and the low specification of the “server” takes the review process to a new level of tedium. However, as the review tool was written in house, I had the power to do something about it! Although I have been using Delphi 2009 since its release, this was the first opportunity I had to put together several of its new language features.
I wrote an simplistic “cache” for the program, that copied the files it needed to reference to a temporary directory on my own machine. To do this in a unobtrusive manner, the files are copied using a background thread. The cache keeps a request list, and a list keeping tabs of what files are currently held in the cache. I utilised closures and anonymous methods to access these lists in a thread safe manner and the generic storage classes found in the Delphi libraries for the lists themselves. As these classes support iterators, I was even able to use these too. (Yes, I realise iterators aren’t “new” to Delphi)
I know none of this is a “new trick” to the managed languages such as C# under .Net 2.0 and onward, or later versions of Java. I was never a C++ developer, but I suspect some of these “new tricks” were always possible with it. Delphi’s TThread class still seems to me a riskier way of writing multi-threaded code than C#, but it is so cool that an “old favourite” can now play along with some of the newer languages and do so “natively” rather than requiring a virtual machine to do so.