|
I do not know how to program in Delphi 6. However, I can help you with the C# implementation. Follow these steps:
- Create a class derived from the
NativeWindow class to handle the messages sent from your Delphi 6 application. - Instantiate the main form.
- When the window has been created for the main form, instantiate an object of your class derived from
NativeWindow and assign the handle of your main form to it using the AssignHandle method. - Process the messages from the Delphi 6 application
- Win the affection of developers and managers everywhere.
I hope that helps.
"we must lose precision to make significant
statements about complex systems."
-deKorvin on uncertainty
|
|
|
|
|
I have a problem with step 2nd:
C:\Documents and Settings\ppp\Pulpit\Sudoku\WindowsApplication1\WindowsApplication1\Form1.cs(108): The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?)
this is what I get about the line
"[DllImport("user32.dll")]"
I tried to add it as a reference (I found appriopriate dll in windows/system32 folder) but it didn`t work as well.
What do you think may be problem?
thank you for help
|
|
|
|
|
Hoping someone can help on this as Google and Google Groups haven't done anything for me! I have 2 ServicedComponents. 1 is a custom collection implementing IEnumerable, the other is a value object. I am replacing existing COM business components, so I don't have the luxury of changing this design. Anyway, I can add the value object to the collection just fine from .NET and COM. I can use a For loop and access the collection via its indexor and it works just fine. But I cannot do a For Each from a COM client; I get the error "Object required". It works great from .NET, and it works from COM if I don't make the value object a serviced component. Here is example code for the collection:
[Guid("1FC8C56E-FE10-4831-B900-892AD2041C64")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ISimpleCollection : IEnumerable, IList
{
void Test();
new int Add(object v);
new IEnumerator GetEnumerator();
}
///
/// Summary description for SimpleCollection.
///
[Guid("CA97A716-4508-4602-A7F4-45F90DBFD93F")]
[ClassInterface(ClassInterfaceType.None)]
public class SimpleCollection : ServicedComponent, ISimpleCollection
{
private ArrayList m_ArrayList = new ArrayList();
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
object[] myObjects = m_ArrayList.ToArray();
return myObjects.GetEnumerator();
}
#endregion
public void Test()
{
}
#region IList Members
public bool IsReadOnly
{
get
{
return m_ArrayList.IsReadOnly;
}
}
public object this[int index]
{
get
{
return m_ArrayList[index];
}
set
{
m_ArrayList[index] = value;
}
}
public void RemoveAt(int index)
{
m_ArrayList.RemoveAt(index);
}
public void Insert(int index, object value)
{
m_ArrayList.Insert(index, value);
}
public void Remove(object value)
{
m_ArrayList.Remove(value);
}
public bool Contains(object value)
{
return m_ArrayList.Contains(value);
}
public void Clear()
{
m_ArrayList.Clear();
}
public int IndexOf(object value)
{
return m_ArrayList.IndexOf(value);
}
public int Add(object value)
{
return m_ArrayList.Add(value);
}
public bool IsFixedSize
{
get
{
return m_ArrayList.IsFixedSize;
}
}
#endregion
#region ICollection Members
public bool IsSynchronized
{
get
{
return m_ArrayList.IsSynchronized;
}
}
public int Count
{
get
{
return m_ArrayList.Count;
}
}
public void CopyTo(Array array, int index)
{
m_ArrayList.CopyTo(array, index);
}
public object SyncRoot
{
get
{
return m_ArrayList.SyncRoot;
}
}
#endregion
}
and the value object:
[Guid("11CAED6B-0E04-4a93-B32B-7100A7B3AD05")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ISimpleObject
{
string SomeValue
{
get;
set;
}
int SomeInt
{
get;
set;
}
}
///
/// Summary description for SimpleObject.
///
[Guid("857E9B62-BCB4-4cb7-B3D3-DD19B2ED074A")]
[ClassInterface(ClassInterfaceType.None)]
public class SimpleObject : ServicedComponent, ISimpleObject
{
private string m_SomeValue = "";
private int m_SomeInt = 0;
#region ISimpleObject Members
public string SomeValue
{
get
{
return m_SomeValue;
}
set
{
m_SomeValue = value;
}
}
public int SomeInt
{
get
{
return m_SomeInt;
}
set
{
m_SomeInt = value;
}
}
#endregion
}
Any help would be greatly appreciated!
|
|
|
|
|
hi there,
I'm new to C# , I have a question abourt performence of c# application.
Could you show me some ideal to improve performence ?
Thank you,
Sincerely,
|
|
|
|
|
Think out the fastest algorithm. Then implement it the fastest way.
C# is very slow, and the compiler can optimize better than you so you can't do anything.
Learn asm and you'll get the best performance, both of your mind and of your computer.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
C# is very slow
I doubt that.
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Try to make a loop that prints all the decimals in pi, or something else.
Then make the same in qbasic (an interpreter!) and you'll see that even a twenty year old interpreter is faster than .Net.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
I didn't say .NET is on par or even faster than other languages, but stating that C# is "very slow" is absolutely not true. For example MDX applications are about 6 to 10 percent slower than their C++ counterparts, sometimes even less. That's actually pretty good considering all the .NET "overhead".
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Have you ever tried what I descibed?
I still think .net is the absolutly slowest platform I've ever programmed on.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
Could you post your code (C# and QBASIC)?
Because you must have done something extremly wrong in the C# version to get such a low performance.
|
|
|
|
|
C#:
static public void cpi()
{
do
{
pi += 1 / a;
pi -= 1 / (a + 2);
a += 4;
Console.WriteLine(pi * 4);
} while (true);
}
</code>
Qbasic:
DEFDBL A-Z
'DEFLNG B
CLS
b = 1
DO
ab = a
a = a + 1 / b
a = a - 1 / (b + 2)
b = b + 4
LOCATE 1, 1: PRINT a * 4, b
LOOP
</code>
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
The flaw in your benchmark is that 99% of the time are used for output of the results and less than 1% is needed for the calculation.
You're not comparing C# to QBasic, you're comparing PRINT to Console.WriteLine.
Console.WriteLine will look at the Windows settings for your preferred decimal separator character etc.
You can't compare it to QBasic's PRINT. Moreover, a lot of time will be used by the console window to render the output. Here it can be a big difference if you reset the cursor position or let the window scroll.
Try this:
static public void cpi()
{
int start = Environment.TickCount;
double pi = 0;
double a = 1;
for (int i = 0; i < 100000000; i++) {
pi += 1 / a;
pi -= 1 / (a + 2);
a += 4;
}
Console.WriteLine(pi * 4);
Console.WriteLine("Finished after " + (Environment.TickCount - start) + " ms");
Console.ReadKey();
}
- against -
DEFDBL A-Y
DEFLNG Z
CLS
Y = TIMER
b = 1
FOR Z = 0 TO 1000000
A = A + 1 / b
A = A - 1 / (b + 2)
b = b + 4
NEXT
PRINT A * 4
PRINT TIMER - Y
CSharp for 100000000 iterations: 1750 ms
QBASIC for 1000000 iterations: 4 s
This means C# is about 230 times as fast as QBASIC for raw calculations. One could still use C# and P/Invoke to an assembler-written PRINT function if you really need to output large amounts of doubles to the console.
|
|
|
|
|
Dammit mine takes almost 2.7 seconds, what CPU do you have? I thought my 3.0 GHz should be fine
modified 12-Sep-18 21:01pm.
|
|
|
|
|
It's very slow. That's what it's meant to be.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
That was the point. C#'s out func and a lot other funcs it got is really slow.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
I have an AMD 64 (3500+) here. Oh, and I used a release build without integer overflow checks, which again is unfair since QBasic does not support those optimizations.
But I think there's no way to create a fair benchmark.
You can create a benchmark that shows pretty much anything if you want.
Write to the console and QBasic is faster than C#.
Use Math.Sin and C# is 50 times faster than Java 1.4.
Construct lots of objects on the heap and C# is faster than C (without using memory pooling).
So the best language always depends on what you want to do. If you need optimal performance, C is the way to go (maybe even use assembler for some sections).
C# is pretty fast, but it's easy to ruin performance by using some slow method. But this is the same as in every language, some functions always are slow.
Console.WriteLine is something that is not performance-critical in nearly all C# applications, so it didn't made sense for Microsoft to write a fast implementation.
You get much better performance in C# if you write to a file instead of the console.
As a side note, there are algorithms that need only 50 iterations to get PI so exactly as a double can store it.
What other .NET functions do you think are slow and would be useful inside critical loops? Console.WriteLine is not one of those for me.
|
|
|
|
|
Writeline is important for me... It's my debugger...
Now I write almost everyting in asm, as it's so fast and easy to get.
It got enought documentation to make me sick, that's the way I love it.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
I also like to use Console.WriteLine for debugging.
WriteLine is slower than PRINT, but both write extremly faster than you can read the output.
If your output is useful for debugging, it probably isn't so long that it can have any impact on the program.
|
|
|
|
|
One example of the performance loss of the Console.WriteLine func is when debugging the program to calc pi.
Since it goes in very fast loop it is very slow.
If you think my program was a bad example, I got a NN program that's built in C#.
It needs to write variables at runtime every loop.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
Niklas Ulvinge wrote: Writeline is important for me... It's my debugger...
Is that important to your customer? will they be looking at debugging statements?
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
I don't got any costomers... I don't think all the 2,3 million members on this site have...
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
Ah-hah!!! Now we get to the reason for this.... I was about to recommend this article[^] but you probably won't need that just yet. But, it is a good read and there are important points in it that are good to know if you wish to go for a career in Software Development in the future.
My: Blog | Photos
"Man who stand on hill with mouth open will wait long time for roast duck to drop in." -- Confucious
|
|
|
|
|
I've already read about that in another book...
Almost all asm books have a section like that in it.
The one and only Niklas Ulvinge aka IDK
|
|
|
|
|
|
It's boring to wait 5 min for a thing to complete when you debug...
The one and only Niklas Ulvinge aka IDK
|
|
|
|